-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ループの外側にあり、最後に 1 回だけ表示されます。

私はこれを次のようなことをしたでしょう:

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 に答える