【问题标题】:dynamic n-bit modules in verilogverilog 中的动态 n 位模块
【发布时间】:2021-03-06 06:24:22
【问题描述】:

我想知道是否可以在 verilog 中创建一个 n 位进位超前加法器。在 cmets 的帮助下,我能够走到这一步

module nbit_lookahead(x, y, cin, cout, s);
  parameter n = 1;
  integer i;
  integer j;
  input wire [n:0] x, y, cin;
  output wire [n:0] cout, s;
  wire [n:0] g, p;
  reg cpp, gp;
  generate
    cpp = 1; // ERROR HERE -- Line 25
     gpp = 1;
    for(i = 0; i < n; i=i+1) begin : outer_loop
      assign p[i] = x[i] | y[i];
        assign g[i] = x[i] & y[i];
        assign s[i] = cin[i]^x[i]^y[i];
        for(j = i - 1; j >= 0; j=j-1) begin : inner_loop
           cpp &= (cin[j] & p[j] & p[i]); // ERROR HERE -- Line 32
           gp &= (g[j] & p[i]) & gp;
        end
        assign cout[n] = cpp | gp | (x[i] & y[i]);
    end
  endgenerate
endmodule

我现在面临的挑战是如何分配 cpp 和 gp。我不断收到错误:

错误 (10170):在fourbit_lookahead.v(25) 附近的文本中出现 Verilog HDL 语法错误:“=”;期待“。”或“(”。检查并修复紧接在指定关键字之前或处出现的任何语法错误。

错误 (10170):在fourbit_lookahead.v(32) 附近的文本中出现 Verilog HDL 语法错误:“&”;期待“。”或“(”。检查并修复紧接在指定关键字之前或处出现的任何语法错误。

【问题讨论】:

  • 我不知道这是否会有所帮助,但 here's an alu32 implementation 使用 parametergenerate 块。由于您的n 不仅仅是通过线路传输的值,而且它实际上决定了要合成的硬件,因此它需要是parameter 而不是input。至少我是这么理解的。
  • 感谢@PatrickRoberts 的帮助我已经更新了我的问题以反映我遇到的特定错误。有什么想法吗?
  • 请记住generate 不支持顺序逻辑。与其声明两个reg,不如声明两组线来累积(cin[j] &amp; p[j] &amp; p[i])(g[j] &amp; p[i])
  • 忘记生成块。有很特别的。你有很多问题。你在这里并不需要它们。尝试使用 always 块。

标签: verilog system-verilog


【解决方案1】:

我很生疏,但是在 for 循环中混合电线和 regs 对我来说是错误的。我在这里尝试的第一件事是制作 cpp 和 gpp 位向量,以便一切都是并行的。这样您就不会在内循环中进行任何重新分配。在生成中,您有 cpp[0]=1'b1 和 gpp[0]=1'b1,然后在内部循环中,将 cpp[i+1] 和 gpp[i+1] 分配给您的值。在循环的每次迭代中设置 cout[n] 看起来也是错误的。您应该根据 cpp[i] 和 gpp[i] 设置 cout[i]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多