基于radix-4改进的booth算法的并行乘法器 - 累加器

时间:2014-01-09 05:54:47

标签: verilog

我正在为基于上述架构的签名号码设计乘法器累加器。我为booth编码器编写了模块,用于生成部分产品和进位保存累加器,两者都正常工作。现在,在编写集成这些子部分的最后一个模块中,我希望mac在第一个时钟周期接受两个输入,产生部分乘积并将它们传递给进位保存加法器,它将累加前一次乘法的结果与现在的。结果将在下一个时钟周期中存储并显示在第二个寄存器中。最初,所有寄存器都复位为0.进位保存累加器基于以下链接中的图A.6:http://infolab.stanford.edu/pub/cstr/reports/csl/tr/94/617/CSL-TR-94-617.appendix.pdf。最终级别包括进位前瞻加法器并输出累加结果。代码的相关部分是:

     CSA_hope csahope (znew, zcnew, pv[0][8:0], pv[1][8:0], pv[2][8:0], pv[3][8:0], 
     sasa, product, xy[19:16], dealsign);//pv=partial products, znew=output of csa,
     product=final accumulated result, xy=input values
always @ (posedge clk)
   begin
   if (reset)
      begin
          xy <= 20'b0;
          product <= 16'b0;
          sasa <= 2'b0;
          dealsign <= 5'b0;

      end
   else
      begin
          dealsign[0] = ~(multiplicand[7] ^ pv[0][8]);
          dealsign[1] = ~(multiplicand[7] ^ pv[1][8]);
          dealsign[2] = ~(multiplicand[7] ^ pv[2][8]);
          dealsign[3] = ~(multiplicand[7] ^ pv[3][8]);
          dealsign[4] = (multiplicand[7] ^ pv[0][8]);

          xy <= {N, multiplicand, multiplier};
          sasa <= 2'b11;
          product <= znew;
      end
  end

当reset = 1时,寄存器sasa和outsign最初包含零,并且一旦reset = 0,它们应该分别占用进位保存累加器的值“1”和“E”(参见图A) 0.6)。然而,这不会发生,并且它们消耗额外的时钟周期以将它们的值改变为1和E,因此产生了错误的结果。这是我为代码编写的测试平台:

    always
#5 clk = !clk;
initial
begin
    $monitor ($time," clk=%b reset=%b x=%d  y=%d xy=%b p0=%b p1=%b p2=%b p3=%b znew=%b  product=%b(%d) 
     dealsign=%b sasa=%b\n",clk, reset, 
    multiplicand, multiplier, fmac.xy,fmac.pv[0][8:0],fmac.pv[1][8:0],fmac.pv[2]   [8:0],fmac.pv[3][8:0], fmac.znew,product,product,fmac.dealsign,fmac.sasa);
    #0 clk = 0; multiplicand = 10; multiplier = 19; reset = 1; 
    #10 reset = 0; N = 4'b0001;
    #30  multiplicand = 11; multiplier = 13; N = 4'b0010;
    #50 $finish;
end

因此,dealign的必要值是在t = 25,而不是在t = 15,因此,t = 25时的乘积出现为0000001010111110(702)而不是0000000010111110(190)。有人可以帮我调试这段代码或建议另一种方法吗?

1 个答案:

答案 0 :(得分:1)

理想情况下,您不应该在不同块的时钟的确切边缘更改输入信号。

虽然你的模拟仍然有效,但你在#10时遇到了竞争条件,因为不确定性首先发生了什么:时钟边沿变化或输入值发生变化。

由于您总是在#5和#10处进行时钟切换,因此最好安排所有输入处于非倍数(在#11,#41,#91等处安排输入更改) )。

然后你就不会有竞争条件,而且在了解波浪时会更容易理解发生的事情。