Testbench Preliminary itator
1 TESTBENCH... 3 2 TESTBENCH... 3 2.1 Testbench... 3 2.2... 4 2.2.1 HDL... 4 2.2.2... 5 2.2.3 PLI... 5 2.3... 6 2.4... 6 2.4.1... 6 2.4.2... 7 3 TESTBENCH... 9 3.1 2-4... 9 3.2... 10 4 testbench... 12 4.1 BFM... 13 2
Testbench_Preliminary Testbench TESTBENCH 1 TESTBENCH TESTBENCH HDL TESTBENCH 1 2 3 2 TESTBENCH 2.1 Testbench module test_bench ; // Testbench always module Testbench NOT U1(. I ( in_ ),. O ( out_ ) ) ; I O in_ out_ 3
NOT U2 ( in_, out_ ); in_ out_ NOT 2.2 2.2.1 HDL HDL HDL CPU / / CPU cs_n = 1 ; // CPU wr_n = 1 ; rd_n = 1 ; addr = 8'hxx ; data = 8'hzz ; # 1000 ; // cs_n = 0 ; wr_n = 0 ; addr = 8'h80 ; data = 8'h00 ; # 100 ; cs_n = 1 ; wr_n = 1 ; 10 addr = 8'hxx ; data = 8'hzz ; 4
2.2.2 HDL IP HDLHDL C/C verilog $readmemb/$readmemh verilog memory verilog memory C verilog 2.2.3 PLI C C PLI program language interface ) PLI C HDL C HDL PLI C HDL PLI 5
2.3 LOG LOG LOG 2.4 2.4.1 1 50 Clk = 0 ; # delay ; forever #(period/2) Clk = ~ Clk ; z z z 2 always Clk = 0 ; always # (period/2) Clk = ~ Clk ; 6
3 repeat Clk = 0 ; repeat ( 6 ) #(period/2) Clk = ~ Clk ; repeat 3 4 50% Clk = 0 ; always # 3 Clk = ~ Clk ; # 2 Clk = ~ Clk ; 2.4.2 1 Rst = 1 ; # 100 ; Rst = 0 ; # 500 ; Rst 1 7
2 1 Rst = 1 ; @( negedge Clk) ; Rst = 0 ; # 30 ; @( negedge Clk) ; Rst = 1 ; // // 2 2 Rst = 1 ; @( negedge Clk) ; // repeat ( 3 ) @( negedge Clk) ; Rst = 1 ; // 3 8
3 TESTBENCH 3.1 2-4 2-4 TESTBENCH `timescale 1ns/100ps module dec2x4 ( A, B, Enable, Z ) ; input A, B, Enable ; output [3:0] Z ; always @( A or B or Enable ) if ( Enable == 1'b0 ) Z = 4'b1111 ; else case ( A, B ) 2'b00 : Z = 4'b1110 ; 2'b01 : Z = 4'b1101 ; 2'b10 : Z = 4'b1011 ; 2'b11 : Z = 4'b0111 ; default : Z = 4'b1111 case module module testbench ; reg a, b, en ; wire [3:0] z ; // dec2x4 DUT (. A ( a ),. B ( b ),. Enable ( en ),. Z ( z ) 9
); // en = 0 ; a = 0 ; b = 0 ; #10 en = 1 ; #10 b = 1 ; #10 a = 1 ; #10 b = 0 ; #10 a = 0 ; #10 $stop ; // always @(en or a or b or z) $display ("At time %t, input is %b%b%b, output is %b", $time, a, b, en, z ) ; module At time 0, input is 000, output is 1111 At time 10, input is 001, output is 1110 At time 20, input is 011, output is 1101 At time 30, input is 111, output is 0111 At time 40, input is 101, output is 1011 At time 50, input is 001, output is 1110 3.2 1 module Count3_ls (Data, Clock, Detect3_ls ) ; input Data, Clock; output Detect3_ ls ; integer Count ; 10
reg Detect3_1s ; Count = 0; Detect3_ls = 0; always @(posedge Clock) if ( Data == 1) Count = Count + 1; else Count = 0; if (Count >= 3) Detect3_ls = 1 ; else Detect3_ls = 0 ; module module test ; reg Data, Clock, Detect ; integer Out_File ; / / Count3_ls DUT (Data, Clock, Detect ) ; Clock = 0 ; forever #5 Clock = ~ Clock ; Data = 0 ; #5 Data = 1; #40 Data = 0; #10 Data = 1; #40 Data = 0; 11
#20 $stop; // // Out_file = $fopen ( "results.txt"); // always @(posedge Clock) if ( Detect == 1'b1 ) $fwrite ( Out_file, "At time %t, Detect out is 1\n"); module 4 testbench testbench testbench testbench harness testcase Testcase Reusable Verification Components Harness Bus Funct. Model DUV Bus Funct. Model RAM harness module testcase testcase harness Testbench 12
Testbench testbench 4.1 BFM BFM Bus functional model BFM testcase C++ C++ read() write() Bus Functional Model addr data cs rd wr CPU CPU CPU 13