2017-05-30 11 views
-1

私は経験豊富なプログラマーですが、HDLを初めて使用しています。私は、私が取っているクラスのための私のハードウェア設計のための基本的な単体テストの実装方法を理解しようとしています。私はSVUnitについて認識していますが、コードを提出する必要があるので、ベアボーンのテスト機能を自分で実装する方が好きです。これは私がもっと学ぶのにも役立ちます。基本ユニットテスト

使用する言語の構成を調べるのに問題があります。私が本当に必要とするのは、コンポーネントをインスタンス化し、入力を駆動し、次に出力値を検証することだけです。検証は私が立ち往生した場所です。それは常にブロックに入る必要がありますか?

私がグーグル・グーグルでなければならない言葉を正しい方向に向けることさえ非常に役に立ちます。これまで私は試みました:Verilog Modelimユニットテスト、Verilog Modelimセルフチェックテストベンチなど、あまりにも多くの成功なし。

EDIT:例: 私は1ビット半加算器の設計をしています。すべての可能な入力組み合わせを実行するテストベンチを作成し、出力が正しいことを自動的に確認するにはどうすればよいですか?

+0

どのデータを駆動する必要があるか、どのように動作するのかについて具体的な説明がない限り、このフォーラムの対象範囲は広範囲です。 –

+0

特定の例を追加しました – anderspitman

+0

verilog + testbench + for + half + adder –

答えて

0

最初の草稿では、のようなものがのように見えます。うまくいけば、それはあなたが開始を取得する必要

wire [3:0] stim_data [1:0]; 
wire [3:0] expected_output; 
always @(posedge clk) 
    if (!rst_n) 
    begin 
    cnt <= 2'b00; 
    end 
    else 
    begin 
    cnt <= cnt + 1; 
    end 
assign {a,b} = stim_data[cnt]; 
always @(posedge clk) 
    if (!rst_n) 
    begin 
    end 
    else 
    begin 
    if (adder !== expected_output[cnt]) 
     // add error message 
    end 

reg clk = 0; 
reg rst_n; 
initial 
begin 
    rst_n = 'bx; 
    #5 
    rst_n = 1'b0; 
    #20 
    rst_n = 1'b1; 
end 

always @(clk) 
begin 
    clk = #10 ~clk; 
end 

reg a,b; 
wire adder = a + b; 
task test; 
    input i0,i1,o; 
    a = i0; 
    b = i1; 
    #1 
    if (adder !== o) 
    $display("Error:Incorrect output"); 
endtask 
initial 
begin 
    wait(rst_n === 1'b0); 
    @(posedge clk) 
    test(0,0,0); 
    @(posedge clk) 
    test(0,1,1); 
    @(posedge clk) 
    test(1,1,0); 
    @(posedge clk) 
    test(1,0,1); 
end 

次に、第二案としてのようなものとして、テストデータを実装するかもしれません。

関連する問題