-2

这个怎么样?我正在寻找输出 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
4

1 回答 1

1

这是用来合成的吗?如果是这样,您可能应该避免使用任务,直到您了解何时可以使用它们。我从不在可综合代码中使用它们。

function另一方面,s 通常用于综合但不能包含时序信息。即一个函数只能表示组合逻辑,这一切都发生在瞬间。

1)这不是您使用分配的方式。正确的用法是:

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。

于 2013-09-19T07:15:43.307 回答