module bin_mult(
output reg [7:0]mult,
output reg [1:0]count,
output carry,
input [3:0]a,b,
input clk,load);
reg enable;
reg [7:0]sum;
reg [3:0]m[3:0];
//reg [1:0]count;
integer i,j;
always@(*) begin
for(i=0;i<=3;i=i+1) begin
for(j=0;j<=3;j=j+1) begin
m[i][j]=b[i]&a[j];
end
end
end
ripple_add ADD(sum,carry,({4'd0,m[count+1]}<<(count+1)),mult,enable);
always@(posedge clk) begin
if(load) begin
mult<={4'd0,m[0]};
count<=0;
end
else if(count==3) count<=0;
else begin
count<=count+1;
if(b[count+1]) begin
//mult<=({4'd0,m[count+1]}<<(count+1))+mult;
enable<=1'b1;
mult<=sum;
end
else mult<=mult;
end
end
endmodule
module ripple_add(
output [7:0]sum,
output co,
input [7:0]a,b,
input en);
parameter cin=1'b0;
genvar i;
wire [7:0]w;
reg [7:0]A,B;
always@(*) begin
if(en) begin
A=a;
B=b;
end
else {A,B}=0;
end
full_add FA0(sum[0],w[0],A[0],B[0],cin);
generate for(i=1;i<=7;i=i+1)
begin
full_add FA(sum[i],w[i],A[i],B[i],w[i-1]);
end
endgenerate
assign co=w[7];
endmodule
module full_add(
output s,co,
input af,bf,cin);
assign s=af^bf^cin;
assign co=(af&bf)|(bf&cin)|(af&cin);
endmodule
我已经编写了用于移位和添加二进制乘法器的 Verilog 代码。在上面的代码中,我尝试使用纹波进位加法器来执行加法(mult<=({4'd0,m[count+1]}<<(count+1))+mult) but getting following errors.
test.v:22:错误:reg sum;不能由原语或连续赋值驱动。
test.v:22:错误:输出端口表达式必须支持连续赋值。
test.v:22: :ripple_add 的端口 1(sum)连接到 sum。
有其他解决方案吗?
当我使用
iverilog
编译代码时,出现这些错误。当我使用 g2012
选项时,代码编译没有错误:
iverilog -g2012 test.v
要获取有关
iverilog
命令的帮助,请使用 -h` 选项:
iverilog -h