如何编写参数化延迟寄存器并解决DELAY=0时Vivado综合报错问题
问题原因
仿真工具xvlog的语法检查逻辑宽松,只会检查实际执行到的代码分支,因此DELAY=0时未触发报错。但Vivado综合工具会对所有静态表达式做全局合法性校验:当DELAY=0时,你定义的dly寄存器位宽计算为(WIDTH*0)-1 = -1,后续位选操作也会出现负数索引,哪怕你逻辑上不会用到这个寄存器,综合工具也会判定语法非法。
解决方法
使用Verilog的generate条件生成块,仅当DELAY>0时才声明延迟寄存器、执行移位逻辑,综合工具只会编译参数匹配分支下的代码,完全规避非法位宽的问题。
修改后的代码如下:
module delay_pipe # ( parameter WIDTH = 32, parameter DELAY = 0 ) ( input clk, input resetn, input [WIDTH-1:0] din, output reg [WIDTH-1:0] dout ); generate if (DELAY == 0) begin: bypass_branch // 零延迟直通逻辑 always @(posedge clk or negedge resetn) begin if (!resetn) begin dout <= '0; end else begin dout <= din; end end end else begin: delay_branch // 仅DELAY>0时生成延迟寄存器和移位逻辑 reg [(WIDTH * DELAY) - 1 : 0] dly; always @(posedge clk or negedge resetn) begin if (!resetn) begin dly <= '0; dout <= '0; end else begin dly <= {dly[(WIDTH*(DELAY-1)) - 1 : 0], din}; dout <= dly[(WIDTH*DELAY)-1 -: WIDTH]; end end end endgenerate endmodule
额外提示:原模块名
latch属于Verilog语境下的敏感关键词,容易和组合逻辑锁存器混淆,建议修改为delay_pipe、sync_shift_reg等更匹配功能的名称。
内容的提问来源于stack exchange,提问作者Adam Wolnikowski
相关产品推荐
相关产品推荐

