Verilog在一个始终块中生成/ genvar

use*_*538 16 verilog

我试图让一个模块在ISE 12.4中通过语法检查,它给了我一个我不明白的错误.首先是一个代码片段:

parameter ROWBITS = 4;

reg [ROWBITS-1:0] temp;

genvar c;
generate
    always @(posedge sysclk) begin
        for (c = 0; c < ROWBITS; c = c + 1) begin: test
            temp[c] <= 1'b0;
        end
    end
endgenerate
Run Code Online (Sandbox Code Playgroud)

当我尝试语法检查时,我收到以下错误消息:

错误:HDLCompiler:731 - "test.v"第46行:不允许对非寄存器<c>进行程序分配.

我真的不明白为什么抱怨."c"不是电线,它是一种genvar.这应该等同于完全合法的语法:

reg [3:0] temp;

always @(posedge sysclk) begin
    temp[0] <= 1'b0;
    temp[1] <= 1'b0;
    temp[2] <= 1'b0;
    temp[3] <= 1'b0;
end
Run Code Online (Sandbox Code Playgroud)

请不要评论如何在没有生成的情况下更容易地编写它.这是一个更复杂的代码片段的简化示例,涉及对"temp"的多个ifs和非阻塞赋值.另外,不要只告诉我有更新版本的ISE,我已经知道了.OTOH,如果您知道它已在ISE的更高版本中修复,请告诉我您知道哪个版本有效.

And*_*ndy 19

您需要在生成块内反转嵌套:

genvar c;
generate
    for (c = 0; c < ROWBITS; c = c + 1) begin: test
        always @(posedge sysclk) begin
            temp[c] <= 1'b0;
        end
    end
endgenerate
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这会生成四个始终块:

always @(posedge sysclk) temp[0] <= 1'b0;
always @(posedge sysclk) temp[1] <= 1'b0;
always @(posedge sysclk) temp[2] <= 1'b0;
always @(posedge sysclk) temp[3] <= 1'b0;
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,四个always块和一个包含四个赋值的always块之间的行为没有区别,但在其他情况下可能存在.

在构造设计的内存表示时(在模拟器的情况下)或映射到逻辑门(在综合工具的情况下)时,需要解决与genvar相关的操作.将always @posedge没有意义,直到设计工作.

受某些限制,您可以在always块中放置for循环,即使是可合成代码也是如此.对于合成,循环将展开.然而,在这种情况下,为循环需要与工作reg,integer或类似的.它不能使用a genvar,因为在always块内部具有for循环描述了在时钟的每个边缘发生的操作,而不是在设计的详细描述期间可以静态扩展的操作.

  • 有什么方法可以在单个always块中生成所有代码,还是genvar无法做到这一点? (2认同)

Gre*_*reg 6

如果您希望temp在同一个块中分配所有位,则不需要生成块.

parameter ROWBITS = 4;
reg [ROWBITS-1:0] temp;
always @(posedge sysclk) begin
    for (integer c=0; c<ROWBITS; c=c+1) begin: test
        temp[c] <= 1'b0;
    end
end
Run Code Online (Sandbox Code Playgroud)

或者,如果您的模拟器支持IEEE 1800(SytemVerilog),那么

parameter ROWBITS = 4;
reg [ROWBITS-1:0] temp;
always @(posedge sysclk) begin
        temp <= '0; // fill with 0
    end
end
Run Code Online (Sandbox Code Playgroud)