Verilog 使用加法和移位的8位顺序乘法器

Verilog 使用加法和移位的8位顺序乘法器,verilog,sequential,test-bench,iverilog,Verilog,Sequential,Test Bench,Iverilog,我正在使用Verilog设计一个8位有符号顺序乘法器。输入为clk(时钟)、rst(复位)、a(8位乘法器)、b(8位乘法器),输出为p(乘积)和rdy(就绪信号,指示乘法结束)。对于负输入,我进行符号扩展并将其保存在15位寄存器变量multiplier和multipliand中。这是我的密码: module seq_mult (p, rdy, clk, reset, a, b); input clk, reset; input [7:0] a, b; output [15:0

我正在使用Verilog设计一个8位有符号顺序乘法器。输入为
clk
(时钟)、
rst
(复位)、
a
(8位乘法器)、
b
(8位乘法器),输出为
p
(乘积)和
rdy
(就绪信号,指示乘法结束)。对于负输入,我进行符号扩展并将其保存在15位寄存器变量
multiplier
multipliand
中。这是我的密码:

module seq_mult (p, rdy, clk, reset, a, b);
   input clk, reset;
   input [7:0] a, b;
   output [15:0] p;
   output rdy;
   
   reg [15:0] p;
   reg [15:0] multiplier;
   reg [15:0] multiplicand;
   reg rdy;
   reg [4:0] ctr;

always @(posedge clk or posedge reset) begin
    if (reset) 
    begin
    rdy     <= 0;
    p   <= 0;
    ctr     <= 0;
    multiplier <= {{8{a[7]}}, a};
    multiplicand <= {{8{b[7]}}, b};
    end 
    else 
    begin 
      if(ctr < 16) 
          begin
          if(multiplier[ctr]==1)
              begin
              multiplicand = multiplicand<<ctr;
              p <= p + multiplicand;
              end
          ctr <= ctr+1;
          end
       else 
           begin
           rdy <= 1;
           end
    end
  end //End of always block
    
endmodule

现在的问题是:代码只适用于前两个输入和后两个输入。对于其余的输入,我得到的数字与预期的不同。有人能指出我的代码中的任何逻辑错误导致这种情况吗?或者,如果有更简单的策略来做同样的事情,请让我也知道。

multiplier
在每次迭代中,如果
multiplier[ctr]
为1,则
ctr
会向左移动

但是
ctr
已经包含了以前的班次,所以您的班次太多了

在每次迭代中,只需将
被乘数
无条件地移位1即可:

multiplicand <= multiplicand << 1;
if (multiplier[ctr] == 1)
begin
    p <= p + multiplicand;
end
ctr <= ctr + 1;
被乘数
10
5 5
2 3
10 1
10 2
20 20
-128 2
10 -128
-1 -1
10 0
0 2
multiplicand <= multiplicand << 1;
if (multiplier[ctr] == 1)
begin
    p <= p + multiplicand;
end
ctr <= ctr + 1;