Verilog 使用32位超前进位加法器乘以两个32位数字

Verilog 使用32位超前进位加法器乘以两个32位数字,verilog,modelsim,Verilog,Modelsim,我曾尝试用Verilog编写代码,使用32位超前进位加法器将两个32位二进制数相乘,但我的程序未能编译生成if条件必须是常量表达式零件“if(存储[0]==1)”和“if(C[32]==1)”的Modelsim中不断出现错误 这是我遵循的算法: Begin Program Multiplier = 32 bits Multiplicand = 32 bits Register = 64 bits Put the multiplier in the least significant half a

我曾尝试用Verilog编写代码,使用32位超前进位加法器将两个32位二进制数相乘,但我的程序未能编译<代码>生成if条件必须是常量表达式零件“if(存储[0]==1)”和“if(C[32]==1)”的Modelsim中不断出现错误

这是我遵循的算法:

Begin Program
Multiplier = 32 bits
Multiplicand = 32 bits
Register = 64 bits
Put the multiplier in the least significant half and clear
the most significant half
For i = 1 to 32
Begin Loop
If the least significant bit of the 64-bit register
contains binary ‘1’
Begin If
Add the Multiplicand to the Most Significant
Half using the CLAA
Begin Adder
C[0 ] = ’0’
For j = 0 to 31
Begin Loop
Calculate Propagate P[j] = Multiplicand[j]^ Most Significant Half[j]
Calculate Generate G[j] =
Multiplicand[j]·Most Significant Half[j]
Calculate Carries C[i + 1] = G[i] + P[i] ·
C[i]
Calculate Sum S[i] = P[i] Å C[i]
End Loop
End Adder
Shift the 64-bit Register one bit to the right 
throwing away the least significant bit
Else
Only Shift the 64-bit Register one bit to the
right throwing away the least significant bit
End If
End Loop
Register = Sum of Partial Products
End Program
代码:

模块乘法器_32(乘法器、被乘数、存储);
输出存储器;
输入[31:0]乘法器,被乘数;
电线[63:0]仓库;
genvar i,j;
导线g=32;
电线[31:0]P,G,总和;
金属丝[32:0]C;
分配存储[31:0]=乘数;

generate for(i=0;iA
generate
块在编译/精化时计算。它们用于从模式构造硬件,而不是计算逻辑。
store[0]
C[32]
,以及所有其他信号的值此时未知。唯一已知的值是参数和genvars

在这种情况下,组合块(
always@*
)将满足您的功能要求。将所有
wire
替换为
reg
,但将
always*
中的所有赋值替换为
always
,并删除所有
assign
关键字(
assign
不应在
always
块中使用)

模块乘法器\u 32(
输入[31:0]乘法器,被乘数,
输出寄存器[63:0]存储
);
整数i,j;
整数g;
reg[31:0]P,G,sum;
reg[32:0]C;
总是开始
g=32;
存储[31:0]=乘数;

对于(i=0;iIs这是唯一涉及的文件?
endgenerate
关键字丢失。我添加了endgenerate。显示的错误是“generate if条件必须是常量表达式”。您使用的
generate
构造方式错误。它应该用于循环以模拟多个实例,但您试图将其用作C-like
for loop
。好的。告诉我如何让这个程序工作?
module Multiplier_32(multiplier,multiplicand,store);
  output store;
  input [31:0]multiplier,multiplicand;
  wire [63:0]store;
  genvar i,j;
  wire g=32;
  wire [31:0]P,G,sum;
  wire [32:0]C;
  assign store[31:0]=multiplier;

  generate for(i=0;i<32;i=i+1)
  begin
    if(store[0]==1)
    begin
      assign C[0]=0;
      for(j=0;j<32;j=j+1)
      begin
        assign P[j]= multiplicand[j]^store[g];
        assign  G[j]=multiplicand[j]&store[g];
        assign  C[j+1]=G[i]|(P[i]&C[j]);
        assign  sum[j]=P[i]^C[j];
        assign g=g-1;
      end

      assign store[63:32]=sum[31:0];

      if(C[32]==1)
      begin
        assign store[62:0]=store[63:1];
        assign store[63]=1;
      end
      else 
      begin
        assign store[62:0]=store[63:1];
        assign store[63]=0;
      end
    end
    else
    begin
      assign store[62:0]=store[63:1];
      assign store[63]=0;    
    end
  end
endgenerate 
endmodule
module Multiplier_32(
    input [31:0] multiplier, multiplicand,
    output reg [63:0] store
  );

integer i,j;
integer g;
reg [31:0] P,G,sum;
reg [32:0] C;

always @* begin
  g = 32;
  store[31:0]=multiplier;
  for(i=0;i<32;i=i+1) begin
    // your code here, do not use 'assign'
  end
end
endmodule