告诉我这段代码有什么问题

时间:2016-06-01 09:36:20

标签: verilog modelsim

此代码描述了这个表达式 - > (a+b)(c+d)。我使用了2个加法器,首先求和a和b,然后是c和d。然后另一个增加结果。不幸的是,我在Verilog工作非常糟糕,所以我无法理解错误。

  module automate(a,b,c,d,clk,start,result,ready);
  parameter n=8;
  input [7:0] a,b,c,d;
  input start,clk;
  output reg[17:0] result;
  output reg ready;
  reg[7:0] ra;
  reg[7:0] rb;
  reg[7:0] rc;
  reg[7:0] rd;
  reg[8:0] sm1;
  reg[8:0] sm2;
  reg[8:0] acc,q;

  always@(posedge start)
  begin
    ra=a;
    rb=b;
    rc=c;
    rd=d;

    sm1=ra+rb;
    sm2=rc+rd;

    q=sm2;
    acc=0;
    ready=0;

    repeat(9)
    begin
      @(posedge clk)
      if(q[0])
        acc=acc+sm1;
      else
        acc=acc;
      q=q>>1;
      q[8] = acc[0];
      acc=acc>>1;
    end

    ready=1;
    result={acc[8:0],q};
  end

endmodule

Testbench:

module test_bench;
reg[7:0] a,b,c,d;
reg clk,start;
wire ready;
wire[17:0] result;

automate res(a,b,c,d,clk,start,result,ready);
initial begin
  start = 0;
  clk=0;

  a=8'd7;
  b=8'd5;
  c=8'd9;
  d=8'd3;

  #30 start = 1;
  wait(ready);
  #20 start = 0;

  #500 $finish;
end

always #10 clk=~clk;

endmodule  

但是我得到的是:

1 个答案:

答案 0 :(得分:0)

根据@Matthew Taylor !!你的代码工作正常,

模拟可能不是TB,因为它是顶层模块, 没有任何东西被驱动到DUT 所以你的信号是X和{{1} }。

Z

然后运行它,您将看到输出如下,

 .....
 automate res(a,b,c,d,clk,start,result,ready);
 initial begin
   $monitor (result, res.sm1, res.sm2); // added monitor system task
   start = 0;
 .....

尽管如此,我想说,你正在编写HDL代码,一个真正的硬件,所以不要使用# x x x # x 12 12 # 144 12 12 ,使用 进行 循环。

如果您的要求只是repeat,则不会使用时钟。

另外,

(A+B) / (C+D)

对于将 always@(*) begin ra = 0; rb = 0; rc = 0; sm1 = 0; sm2 = 0; result = 0; if(start) begin ra = a; rb = b; rc = c; rd = d; sm1 = ra + rb; sm2 = rc + rd; result = product(sm1, sm2); end end product相乘的函数sm1

sm2

所以我认为开始和准备将在同一周期断言。截至目前,您的代码中没有顺序逻辑。

希望这会对你有所帮助。

编辑:

对于您的第二个问题,请使用以下脚本命令:

  function [17:0] product;
    input [8:0]  multiplier, multiplicand;

    integer i;

    begin
      product = 0;
      for(i=0; i<17; i=i+1)
        if( multiplier[i] == 1'b1 )
          product = product + ( multiplicand << i );
     end
   endfunction