破天荒 · 2022年07月29日

Verilog之Generate for用法注意事项

Verilog之Generate for用法注意事项

  1. Generate for的用法:

    对于FPGA工程师来讲verilog语法可以说是不能再熟悉了,在verilog中generate for可以用来生成重复性的逻辑,比如下面这段代码定义了一个寄存器组ddr3_mem来模拟DDR3,按照地址将数据写入ddr3_mem;

parameter  DDR3_DEPTH = 65536;
reg [127:0]    ddr3_mem[DDR3_DEPTH-1:0];

genvar i;
generate for (i=0; i<DDR3_DEPTH; i=i+1)
begin: DDR3
    always@(posedge clk or posedge rst)
    begin
        if(rst)
        begin
            ddr3_mem[i] <= 'h0;
        end
        else
        begin
            if(app_en && app_rdy && app_cmd == 3'b000 && app_wdf_rdy && app_wdf_wren)
            begin
                if(app_addr[28:03] == i)
                begin
                    ddr3_mem[i] <= app_wdf_data;
                end
            end
        end 
    end
end
endgenerate
  1. 注意事项

    虽然generate for生成的代码是可综合的,但个人更多的在testbench中使用,那么在使用的过程中笔者就发现这个for循环的循环层数是有限制的,最大不能超过100000,如果超过了至少modelsim就会报错,error信息如下。所以我上面的代码中parameter定义成了65536。

# do {tb_ddr_rw_user_2_simulate.do}
# vsim -voptargs=""+acc"" -L xbip_utils_v3_0_10 -L xbip_pipe_v3_0_6 -L xbip_bram18k_v3_0_6 -L mult_gen_v12_0_16 -L xil_defaultlib -L blk_mem_gen_v8_4_4 -L unisims_ver -L unimacro_ver -L secureip -L xpm -lib xil_defaultlib xil_defaultlib.tb_ddr_rw_user_2 xil_defaultlib.glbl 
# Start time: 14:25:32 on Jul 28,2022
# ** Note: (vsim-3813) Design is being optimized due to module recompilation...
# ** Error: ../../../../../../src/ddr3.v(45): (vopt-2134) Evaluation of a generate loop has exceeded the iteration limit of 100000.
# ** Note: ../../../../../../src/ddr3.v(45): (vopt-2129) Design elaboration has evaluated 100001 loop generated blocks.
# Optimization failed
# Error loading design
# Error: Error loading design
#        Pausing macro execution
# MACRO ./tb_ddr_rw_user_2_simulate.do PAUSED at line 9

2022-07-28_142921.png

推荐阅读
关注数
9
文章数
6
FPGA攻城狮一枚~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息