2017-08-30 4 views
2

Ich teste ein Modul für ein 8-Bit-Register, getrennt von dem Rest meines Codes. Ich verwende ModelSim, um die Werte festzulegen und dann Ausführen, um die Ergebnisse anzuzeigen. Dieses Modul soll einen binären Zahleneingang, ein klares Bit, ein Freigabebit und einen Ausgang haben.Verilog Registercode Fehler - Zustandsprüfungen

module Register8bit(D, Clk, Clear, Enable, OutNum); 
    input [7:0] D; //8 bit binary data 
    input Clk;  //Clock 
    input Clear;  //Clear bit 
    input Enable; //Enable bit 
    output reg [7:0] OutNum; 

always @(posedge Clk) 
begin 
    if (Enable) 
     begin 
      if (Clear) 
       OutNum <= 8'b00000000; 
      else 
       OutNum <= D; 
     end 
end 
endmodule 

Hier ist die Ausgabe I (in dieser Reihenfolge) erwarten, mit D = 10001111 und Clk = 1.

Steps CLR Enable OutNum 
1  0  0   xxxxxxxx (initially undefined) 
2  0  1   10001111 (input data is used) 
3  1  0   10001111 (because write-protection) 
4  1  1   00000000 (Clear and Enable are true, so set to 0) 
5  0  1   10001111 (Clear is false and Enable is true, so use input data) 

Der erste Schritt funktioniert, aber die zweiten nicht (so die Ruhe funktioniert auch nicht). Insbesondere bleibt OutNum im zweiten Schritt undefiniert. Die Aktualisierung von OutNum mit den Eingabedaten funktioniert im ersten Schritt, wenn Enable wahr ist.

Wie soll ich dieses Modul reparieren?

Prüfstands Code:

`timescale 1ns/1ps 

module test_register; 

//inputs 
reg [7:0] D; 
reg Clk; 
reg Clear; 
reg Enable; 

//outputs 
reg [7:0] OutNum; 

//instantiate 
Register8bit uut(
    .D(D), 
    .Clk(Clk), 
    .Clear(Clear), 
    .Enable(Enable) 
); 

initial begin 
    D = 10001111; 
    Clk = 1; 

    //step 1 
    #100; 
    Clear = 0; 
    Enable = 0; 
    #100; 

    //step 2 
    Clear = 0; 
    Enable = 1; 
    #100; 

    //step 3 
    Clear = 1; 
    Enable = 0; 
    #100; 

    //step 4 
    Clear = 1; 
    Enable = 1; 
    #100; 

    //step 5 
    Clear = 0; 
    Enable = 1; 
    #100; 
end 
endmodule 
+0

Der Testbench-Code ist aktiv. – Rez

Antwort

1

Sie benötigen Clk Signal viele Male hin- und herzuschalten. Ihr Code setzt es nur auf 1 und belässt es dann für die ganze Simulation bei 1.

module test_register; 

//inputs 
reg [7:0] D; 
reg Clk; 
reg Clear; 
reg Enable; 

//outputs 
reg [7:0] OutNum; 

//instantiate 
Register8bit uut(
    .OutNum (OutNum), // <---- added missing output 
    .D(D), 
    .Clk(Clk), 
    .Clear(Clear), 
    .Enable(Enable) 
); 

always #50 Clk = ~Clk; 

always @(negedge Clk) begin 
    $display($time, " clr=%b en=%b D=%b OutNum=%b", Clear, Enable, D, OutNum); 
end 

initial begin 
    D = 'b10001111; // <---- use 'b 
    Clk = 1; 

    #50; 

    //step 1 
    #100; 
    Clear = 0; 
    Enable = 0; 
    #100; 

    //step 2 
    Clear = 0; 
    Enable = 1; 
    #100; 

    //step 3 
    Clear = 1; 
    Enable = 0; 
    #100; 

    //step 4 
    Clear = 1; 
    Enable = 1; 
    #100; 

    //step 5 
    Clear = 0; 
    Enable = 1; 
    #100; 
    #500 $finish; 
end 
endmodule 

/* 

Prints out: 

        50 clr=x en=x D=10001111 OutNum=xxxxxxxx 
       150 clr=0 en=0 D=10001111 OutNum=xxxxxxxx 
       250 clr=0 en=1 D=10001111 OutNum=xxxxxxxx 
       350 clr=1 en=0 D=10001111 OutNum=10001111 
       450 clr=1 en=1 D=10001111 OutNum=10001111 
       550 clr=0 en=1 D=10001111 OutNum=00000000 
       650 clr=0 en=1 D=10001111 OutNum=10001111 
       750 clr=0 en=1 D=10001111 OutNum=10001111 
       850 clr=0 en=1 D=10001111 OutNum=10001111 
       950 clr=0 en=1 D=10001111 OutNum=10001111 
       1050 clr=0 en=1 D=10001111 OutNum=10001111 

*/