我想在任务中使用 generate 语句。以下代码给出了编译错误(iverilog)。
task write_mem; //for generic use with 8, 16 and 32 bit mem writes
input [WIDTH-1:0] data;
input [WIDTH-1:0] addr;
output [WIDTH-1:0] MEM;
integer i;
begin
generate
genvar j;
for(j=0; j<i;j++)
MEM[addr+(i-j-1)] = data[(j*8):((j*8) + 8)-1];
endgenerate
end
endtask // write_mem
Run Code Online (Sandbox Code Playgroud)
我也尝试将其放在generateline 之后integer i,但仍然产生错误。有什么想法吗?
编辑:我也尝试将genvar声明放在begin和generate在上面的代码中将语句。它仍然产生编译器错误
提前致谢,
杰·奥拉宾德
您正在尝试的是不可能的 - 生成区域(generate..endgenerate 块)只允许在模块描述中(又名“顶级”),即您拥有参数、连线、always- 和 inital-regions 的同一级别等(参见 IEEE Std. 1364-2005 中的语法 12-5)。在任务中,生成区域与赋值语句一样无效。
但是,您可以在任务中使用非生成 for 循环(这也是可合成的)。
无论哪种方式,您都不能在可合成代码中从 0 数到 i-1,因为“i”不是常数。另请注意,j++ 不是有效的 verilog,您必须改写 j=j+1。最后,您可能希望使用非阻塞赋值 (<=) 而不是阻塞赋值 (=),但这取决于您打算如何使用此任务。