簡體   English   中英

使用 Verilog 的 Mux 4x1 測試台

[英]Testbench of a Mux 4x1 using Verilog

我正在嘗試使用測試台來測試 4X1 Mux [a,b,c,d 是輸入,z 是 output 和 s 是 Z99938282F040718CF42ZEF6DZ 線] 的某些功能。 這是我的代碼:

module testbench_MUX();



  reg a,b,c,d;

  reg [1:0] s;

  wire z ; 


  MUX4_1 mux(.a(a) ,.b(b),.c(c),.d(d), .s(s),.z(z));


  initial begin 
    $dumpfile("dump.vcd");
    $dumpvars;
  end 

initial begin // {
     a='b0;b='b1 ;c='b0 ;d='b1 ;s='d0;#15
    if(z==0) $display("time : %0t Test # 1 : passed",$time);
    a='b0;b='b1 ;c='b0 ;d='b1 ;s='d1;#15
    if(z==1) $display("Test # 2 : passed");
    a='b0;b='b0 ;c='b1 ;d='b1 ;s='d1; #15
    if(z==0) $display("Test # 3 : passed");
    a='b1;b='b0 ;c='b0 ;d='b0 ;s='d1; #15
    if(z==0) $display("Test # 4 : passed");

    $finish;
    end // } 

這是波形:

在此處輸入圖像描述

kernel 顯示測試 1 已通過,這意味着 z=0:

# KERNEL: time : 15Test # 1 : passed

但是,從時間 15ns 的波形中可以看出(仿真時間標度為 1ns/1ns),z=1。 為什么執行if語句?

MUX設計代碼:

module MUX4_1(
  input  a,b,c,d, 
  input   [1:0] s,
  output reg  z

);
  always @ (*) begin
    if ( s==0) 
      z=a;

    else if ( s==1) 
      z=b;

    else if ( s==2) 
      z=c;
    else if (s==3)

      z=d;

    else  
      z=a;

  end 

endmodule: MUX4_1

你有一個競爭條件。 在時間 15,您更改s輸入,這會導致z output 從 0 更改為 1。同時您對z output 進行采樣( if(z=0) )。 模擬器看到z為 0。

您應該延遲更改輸入的時間,以便在您知道 output 將穩定時對其進行采樣。 例如:

initial begin
    a='b0; b='b1 ; c='b0 ; d='b1  ;s='d0;
    #15
    if(z==0) $display("time : %0t Test # 1 : passed",$time);
    #1;

    a='b0;b='b1 ;c='b0 ;d='b1 ;s='d1;

在這種情況下, z將在時間 15 檢查,然后s將在時間 16 更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM