Verilog 使用for循环时出错[不允许对非寄存器i进行过程赋值]

Verilog 使用for循环时出错[不允许对非寄存器i进行过程赋值],verilog,Verilog,我对Verilog不是很有经验。我试图使用for循环生成RCA,但在尝试合成模块时出错 我得到的错误是 不允许对非登记册i进行程序性转让 感谢您的帮助。谢谢 generate for(i = 0; i <= BIT_WIDTH-1; i = i + 1) begin fadder fadder_inst (.s(s[i]), .cout(cin_wire[i+1]), .a(a[i]), .b(b[i]), .cin(cin_wire[i])); end endgenerate 您

我对Verilog不是很有经验。我试图使用for循环生成RCA,但在尝试合成模块时出错

我得到的错误是

不允许对非登记册i进行程序性转让

感谢您的帮助。谢谢

generate 
for(i = 0; i <= BIT_WIDTH-1; i = i + 1)
begin
  fadder fadder_inst (.s(s[i]), .cout(cin_wire[i+1]), .a(a[i]), .b(b[i]), .cin(cin_wire[i]));
end
endgenerate
您不能在always块中生成模块

在连接到fadder_inst之前,必须在always块内单独操作输入

我想,RCA并不依赖于时钟。它的纯异步电路

不能在程序块初始值内实例化模块, 永远,永远,永远,永远,永远,永远,最后,任务,功能

你可以做如下的事情来达到你的目的

module fadder (clk, s, cout, a, b, cin);
  input   a, b, cin, clk;
  output reg  s, cout;

  always @ (posedge clk)
  begin
    s = (a ^ b) ^ cin;
    cout = ((a & b) | ((a | b) & cin));
  end
endmodule

//RCA Logic
module part1(s, cout, a, b, cin, clk);
  parameter BIT_WIDTH = 128;

  input [BIT_WIDTH-1:0] a, b;
  input cin;
  input clk;
  output cout;
  output [BIT_WIDTH-1:0] s;

  wire [BIT_WIDTH:0] cin_wire;

  assign cin_wire[0] = cin;   

  genvar i;   
  generate
  begin
    for(i = 0; i <= BIT_WIDTH-1; i = i + 1) //error is on this line
    begin:
      fadder fadder_inst (.clk(clk), .s(s[i]), .cout(cin_wire[i+1]), .a(a[i]), .b(b[i]), .cin(cin_wire[i]));
    end
  end  
  endgenerate

  assign cout = cin_wire[BIT_WIDTH];
endmodule

正如其他人所指出的,您不能在always块中实例化模块。需要将两条导线分开,并创建一条新导线来连接这两条导线


在下面的示例中,cout和s是reg类型的输出。根据基于命名约定的cin_线添加了一条线s_线,该线连接到fadder_inst实例的s输出。部件1和cout输出分别同步分配给s_线和cin[BIT_WIDTH]。注意,它们被分配了非阻塞分配,那么clk信号呢?在always块中单独操作输入是什么意思?请帮忙。所以RCA是时钟相关电路?是的,它是时钟相关电路。它是用一个顶部电路的时钟来实例化的。你能上传实际的电路图吗?它有RCA的时钟@ElDj您不能在始终@posedge时钟块内实例化。只有寄存器分配应在时钟块内完成。实例描述了物理硬件未触发的软件功能。顺序逻辑应分配非阻塞分配是的,理想情况下顺序逻辑应使用它实际上比4个周期更差,它高达位_宽度周期不确定我从何处获得4,可能快速读取代码,并认为位_宽度的值为4。cout在每个全加器上都被触发器触发,因此它需要一个时钟周期来传播每个阶段。例如,如果a=15,b=1,cin=0,则需要4个时钟才能获得输出s=16。在模拟器上尝试使用非阻塞分配,确保调度器中没有竞争条件,或者使用研究从synthesis.Ok生成的门级示意图。我想你说的是ripple进位加法器的固有延迟。是的,它会在那里。
module fadder (clk, s, cout, a, b, cin);
  input   a, b, cin, clk;
  output reg  s, cout;

  always @ (posedge clk)
  begin
    s = (a ^ b) ^ cin;
    cout = ((a & b) | ((a | b) & cin));
  end
endmodule

//RCA Logic
module part1(s, cout, a, b, cin, clk);
  parameter BIT_WIDTH = 128;

  input [BIT_WIDTH-1:0] a, b;
  input cin;
  input clk;
  output cout;
  output [BIT_WIDTH-1:0] s;

  wire [BIT_WIDTH:0] cin_wire;

  assign cin_wire[0] = cin;   

  genvar i;   
  generate
  begin
    for(i = 0; i <= BIT_WIDTH-1; i = i + 1) //error is on this line
    begin:
      fadder fadder_inst (.clk(clk), .s(s[i]), .cout(cin_wire[i+1]), .a(a[i]), .b(b[i]), .cin(cin_wire[i]));
    end
  end  
  endgenerate

  assign cout = cin_wire[BIT_WIDTH];
endmodule
// ...
output reg cout;
output reg [BIT_WIDTH-1:0] s;

wire [BIT_WIDTH-1:0] s_wire;
wire [BIT_WIDTH:0] cin_wire;
assign cin_wire[0] = cin;   

genvar i;
generate
  for(i = 0; i <= BIT_WIDTH-1; i = i + 1)
  begin
    fadder fadder_inst (.s(s_wire[i]), .cout(cin_wire[i+1]), .a(a[i]), .b(b[i]), .cin(cin_wire[i]));
  end
endgenerate

always@(posedge clk)
begin
  s <= s_wire;
  cout <= cin_wire[BIT_WIDTH];
end
// ...