Verilog代码添加由for循环生成的两个整数

时间:2013-09-19 06:37:00

标签: verilog

这个怎么样?我正在寻找输出i + j = 1 + 2,2 + 3 ... 4 + 5。

module add(i,j,b);
  input [31:0] i, j; //32 bit unsigned 
  output [31:0] y; 

  task ADD(i, j, y); 
  begin 
    for (i= 1; i <= 4; i++) 
      begin 
      for(j=2; j <= 5; j++) 
        assign y = i + j; 
      end
    end 
    $display("y ", y); 
  endtask 
endmodule

1 个答案:

答案 0 :(得分:0)

这是用于合成吗?如果是这样,你应该避免使用任务,直到你知道什么时候可以使用它们。我从不在可合成代码中使用它们。

另一方面,

function通常用于合成但不包含时序信息。即一个函数只能代表组合逻辑,这一切都是瞬间发生的。

1)这不是你如何使用assign。正确的用法是:

wire [9:0] a;
assign a = 10'b0;

//or
//a,b both 10 bits driven from other logic
wire [9:0] sum;
assign sum = a + b;

请注意您如何分配电线,这是组合。

2)你的显示器在for循环之外,它只会在结束时显示一次。

我会这样做:

module add(
  input  [31:0] a,
  input  [31:0] b,
  output [31:0] sum
);

  assign sum = a + b ;

endmodule

module testharness();
  reg  [31:0] a;
  reg  [31:0] b;
  wire [31:0] sum;
  reg         clock;

// Make clock toggle every 10ns (20ns clock period)
initial begin
  clock = 0;
  forever begin
    #10ns clock= ~clock;
  end
end

//DUT (Device Under Test)
add add_0 (
  .a   ( a   ),
  .b   ( b   ),
  .sum ( sum )
);

// Test program
initial begin
  a=0;
  b=0;
  @(posedge clock);
  $display( "a (%2d) + b (%2d) = sum (%2d)", a, b, sum );

  a=1;
  b=2;
  @(posedge clock);
  $display( "a (%2d) + b (%2d) = sum (%2d)", a, b, sum );

  a=3;
  b=4;
  @(posedge clock);
  $display( "a (%2d) + b (%2d) = sum (%2d)", a, b, sum );

  $finish;
end

endmodule

请注意我们如何利用时间分隔结果,对于更复杂的设计,您可以使用触发器,这意味着您每个时钟只能获得一个新结果。或者,如果使用DDR技术,则按上升沿和下降沿。

您现在可以尝试修改测试程序部分,以根据您的要求激发DUT。