我正在尝试获取一个模块以通过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

尝试语法检查时,出现以下错误消息:



我真的不明白为什么要抱怨。 “c”不是电线,是发电机。这应该等效于完全合法的语法:
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

请不要发表评论,而无需生成该代码会更容易。这是一个复杂得多的代码的简化示例,其中涉及多个if和对“temp”的非阻塞分配。另外,不要只告诉我有更新版本的ISE,我已经知道。 OTOH,如果您知道它在ISE的更高版本中已修复,请告诉我您知道哪个版本适用。

最佳答案

您需要反转generate块内的嵌套:

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

从技术上讲,这会生成四个Always块:
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;

在这个简单的示例中,四个Always块和包含四个分配的单个Always块之间的行为没有差异,但在其他情况下,可能会有所不同。

当构 build 计的内存表示(对于模拟器)或映射到逻辑门(对于综合工具)时,需要解决与genvar相关的操作。直到设计开始运行,always @posedge才有意义。

受到某些限制,即使对于可合成的代码,也可以在always块中放入for循环。对于综合,循环将展开。但是,在这种情况下,for循环需要使用reginteger或类似代码。它不能使用genvar,因为在always块中包含for循环描述了在时钟的每个边沿发生的操作,而不是在详细设计时可以静态扩展的操作。

10-04 16:00