HDLBits:Bcdadd100
题目:使用100个BCDadd module 来计算400bit的加法。
原始代码
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [99:0] cout_temp;
genevar i;
always @(*) begin
bcd_fadd u_add(a[3:0],b[3:0],cin,cout_temp[0],sum[3:0]);
for(int i =1;i<100;i=i+1)begin
bcd_fadd u_add(a[3+i*4:i*4],b[3+i*4:i*4],cout_temp[i-1],cout_temp[i],sum[3+i*4:i*4]);
end
cout = cout_temp[99];
end
endmodule
报错信息:
会报编译错,没看懂报错。但是看网上资料,原因是不能在always块中实例化module,得用generate的形式。下面这段话看了豁然开朗。
解决方案:
改成generate形式可解决报错
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [99:0] cout_temp;
genvar i;
generate
bcd_fadd u_add(a[3:0],b[3:0],cin,cout_temp[0],sum[3:0]);
for(i =1;i<100;i=i+1)begin:test
bcd_fadd u_add(a[3+i*4:i*4],b[3+i*4:i*4],cout_temp[i-1],cout_temp[i],sum[3+i*4:i*4]);
end
assign cout = cout_temp[99];
endgenerate
endmodule
还必须加个for循环的名字(test),不然也会报错。