Verilog 使用for循环时出错[不允许对非寄存器i进行过程赋值]
我对Verilog不是很有经验。我试图使用for循环生成RCA,但在尝试合成模块时出错 我得到的错误是 不允许对非登记册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 您
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
// ...