我希望能够使用生成块参数化一些行为级别的 Verilog。该模块用于可重新配置的读出和 FIFO 块,主要是我们可以编写一个代码并在顶层使用一个参数。
假设我们有:
always @(posedge write_out_clk or posedge RESETN)
begin
if (RESETN)
SENSE_ADDR <= 0;
else if (enb[0] == 1)
SENSE_ADDR <= 1; // for example but may be some other wire/bus etc
else if (enb[1] == 2)
SENSE_ADDR <= 1; // for example but may be some other wire/bus etc
else
SENSE_ADDR <= SENSE_ADDR;
end
end
这是行为性的,所以实现的细节留给编译器,用户给定时序约束等。如果我对它们进行硬编码,这适用于块内的“n”个 else-if 语句,目前综合和模拟都适用于 16 个语句。
然而,我的问题是如何使用生成参数化它?显然,如果 'n=8' 对其进行硬编码并没有什么大不了的。如果'n = 64'或'n = 128'等怎么办。如果模块的其余部分使用'n'的生成完全参数化,硬编码它似乎是一种耻辱......
我试过做类似的事情:
genvar elseif_generate;
generate
for (elseif_generate=0; elseif_generate<FIFO_SUB_BLOCKS; elseif_generate=elseif_generate+1)
begin: elseif_generate_logic
always @(posedge write_out_clk or posedge RESETN)
begin
if (RESETN)
SENSE_ADDR <= 0;
else if (enb[elseif_generate] == 1)
SENSE_ADDR <= some_wire[elseif_generate];
else
SENSE_ADDR <= SENSE_ADDR;
end
end
endgenerate
然而,这会导致输出线“SENSE_ADDR”出现多源错误。这让我想到了另一个问题。显然生成块在这里不适合,但我将如何为这个块实现参数化代码复制?基本上我想要行为的功能,硬编码的 if-else 总是以参数化的形式阻塞......