【问题标题】:Mojo IDE - Generate For Loop Block in VerilogMojo IDE - 在 Verilog 中生成 For 循环块
【发布时间】:2018-03-16 11:17:30
【问题描述】:

所以,我一直在用最新版本的 Mojo-IDE v1.3.6 解决这个问题

下面是我的代码的简短 sn-p。正如您所看到的,我正在尝试使用带有 for 循环的生成来创建“Hashers”块的许多实例。

genvar i;

generate
    for (i = 0; i < 64/LOOP; i = i + 1) begin : HASHERS
        wire [511:0] W;
        wire [255:0] state;

        if(i == 0)
            sha256_digester U (
                .clk(clk),
                .k(Ks[32*(63-cnt) +: 32]),
                .rx_w(feedback ? W : rx_input),
                .rx_state(feedback ? state : rx_state),
                .tx_w(W),
                .tx_state(state)
            );
        else
    sha256_digester U (
                .clk(clk),
                .k(Ks[32*(63-LOOP*i-cnt) +: 32]),
                .rx_w(feedback ? W : HASHERS[i-1].W),
                .rx_state(feedback ? state : HASHERS[i-1].state),
                .tx_w(W),  
                .tx_state(state)
            );
    end

endgenerate

但是,当我尝试合成时出现以下错误:

Line 89, Column 38 : extraneous input '.' expecting {')', '[', '<=', '*', '+', '-', '?', '&', '|', '^', '~^', '^~', '/', '%', '==', '!=', '===', '!==', '&&', '||', '**', '<', '>', '>=', '>>', '<<', '>>>', '<<<'}
Line 90, Column 46 : extraneous input '.' expecting {')', '[', '<=', '*', '+', '-', '?', '&', '|', '^', '~^', '^~', '/', '%', '==', '!=', '===', '!==', '&&', '||', '**', '<', '>', '>=', '>>', '<<', '>>>', '<<<'}

错误在行

                .rx_w(feedback ? W : HASHERS[i-1].W),
                .rx_state(feedback ? state : HASHERS[i-1].state),

根据 Verilog-2000 指南,这应该是合法的,因为我应该能够访问“HASHERS”的先前索引以获得 rx_w 的“W”位。

任何帮助将不胜感激。

问候, S

【问题讨论】:

  • 我认为是系统verilog扩展,不是verilog[cnt +: 32] 。它可能会导致您在下一行出现问题。
  • 嘿 Serge - 感谢您的评论。我注释掉了那行并且错误仍然存​​在。我想知道mojo-ide是使用verilog还是系统verilog。
  • 第二个猜测是你的编译器没有正确解析HASHERS[i-1].W。尝试将您的模块名称添加到其中:yourmodule.HASHERS[i-1].W
  • 刚刚试了一下 - 模块名称是 sha256_transform - 我尝试了 sha256_transform.HASHERS[i].W 并且不幸的是错误仍然存​​在。 HASHERS 被实例化为 for 循环的一部分,因此它与其余代码位于同一模块中。我感谢您的帮助!更新:使用 Hashers[0].W 似乎有效。我想知道它是否与使用 genvar 作为块的索引有关。
  • 明确一点,[cnt +: 32] 是 Verilog(不仅仅是 SystemVerilog)。

标签: verilog fpga mojo


【解决方案1】:

我用 vcs 试了一下,这段代码没有产生任何问题。因此,看起来您的 verilog 编译器在生成块方面存在问题。

我建议将您的 Wstate 声明移到块外,如下所示:

 wire [511:0]  W[64/LOOP-1:0];
 wire [255:0]  state[64/LOOP-1:0];
 genvar i;
 generate
    for (i = 0; i < 64/LOOP; i = i + 1) begin : HASHERS

       if(i == 0)
         sha256_digester U (
                            .clk(clk),
                            .k(Ks[32*(63-cnt) +: 32]),
                            .rx_w(feedback ? W[I] : rx_input),
                            .rx_state(feedback ? state[i] : rx_state),
                            .tx_w(W[i]),
                            .tx_state(state[i])
                            );
       else
         sha256_digester U (
                            .clk(clk),
                            .k(Ks[32*(63-LOOP*i-cnt) +: 32]),
                            .rx_w(feedback ? W[i] : W[i-1]),
                            .rx_state(feedback ? state[i] : state[i-1]),
                            .tx_w(W[i]),  
                            .tx_state(state[i])
                            );
    end

 endgenerate

【讨论】:

  • 好的,那么听起来像是 Mojo-IDE 的问题。当我回到我的电脑时,我会试试看.. 会不会为每个哈希器创建一个单独的线?所以如果我提到 HASHER[X].W[Y] 它会不同于 HASHER[Z].W[S]?
  • 是的,没有什么真正改变。和以前一样,每个循环将有一个实例U。将有没有 HASHER[whatever].W。您的模块内将只有 W[i] 。它不再是 HASHER 块的一部分。
  • 我明白了。稍后在代码中我需要解析 State 和 W。例如,如果我想为给定的调用获取 x 的前 32 位,那么调用将是 state[x][31:0]?很抱歉所有问题,我非常感谢您迄今为止提供的所有帮助。
  • 是的,您可以在评论中将其用作二维数组。
  • 嗯,它会编译,所以很好 - 开始测试。再次感谢您的帮助,Serge。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多