2017-02-24 1 views
0

Ich habe hier ein kleines Problem, als ich meine Module instanziiert habe. Ich verwende eine Generierungsschleife, um 100 Instanzen von 2 Zählern zu erstellen (16 & 32-Bit-Zähler). Jeder Zähler sollte eigene unabhängige Steuerelemente haben (UPDN & DE), aber sie teilen sich eine Uhr und einen Reset.SystemVerilog Instanziierte Module teilen Inputs, wenn sie nicht sollten (einfache Lösung)?

Modulbeschreibungen:

SAT_COUNTER.sv // SIMPLE ZÄHLMODUL

TWO_SC.sv // instanziiert ZWEI SAT_COUNTER MODULE (16 BIT & 32 BIT TISCHE)

GEN_SC.sv // INSTANTIATE 100 MODULE ZWEI_SC MODULE

tb_GEN_SC.sv // Testbench

Ich bin sicher, dass mein Problem im GEN_SC Modul ist, wo ich alle 100 instanziiert ..

schätze ich jede Hilfe! Vielen Dank im Voraus!

module SAT_COUNTER(
    COUNT,   // SCALABLE COUNT OUTPUT 
    CLK,   // CLOCK 
    al_RST,   // ACTIVE LOW RESET 
    UPDN,   // COUNTER WILL COUNT: UP = 1; DN = 0; 
    EN);   // ENABLE 

    parameter WIDTH = 8; 

    input CLK, al_RST, UPDN, EN; 
    output reg [WIDTH-1:0] COUNT; 

    ... 

endmodule 

//********************** 

module TWO_SC(
    COUNT1,  // N-BIT COUNTER OUTPUT 
    COUNT2,  // M-BIT COUNTER OUTPUT 
    CLK,   // CLOCK 
    al_RST,  // ACTIVE-LOW RESET 
    UPDN,   // DIR. CONTROL 
    EN);   // ENABLE 

    parameter WIDTH1 = 16; 
    parameter WIDTH2 = 32; 

    input CLK, al_RST; 
    input [1:0] UPDN, EN; 
    output [WIDTH1-1:0] COUNT1; 
    output [WIDTH2-1:0] COUNT2; 

    SAT_COUNTER #(WIDTH1) GSC1(.COUNT(COUNT1), .CLK(CLK), .al_RST(al_RST), .UPDN(UPDN[0]), .EN(EN[0])); 
    SAT_COUNTER #(WIDTH2) GSC2(.COUNT(COUNT2), .CLK(CLK), .al_RST(al_RST), .UPDN(UPDN[1]), .EN(EN[1])); 

endmodule 

//********************** 

module GEN_SC(
    COUNT1,  // COUNT1 
    COUNT2,  // COUNT2 
    CLK,   // CLOCK 
    al_RST,  // ACTIVE-LOW RESET 
    UPDN,   // DIR. CONTROL 
    EN);   // ENABLE 

    parameter MOD_COUNT = 100; 
    parameter WIDTH1 = 16; 
    parameter WIDTH2 = 32; 

    input CLK, al_RST; 
    input [1:0] UPDN [MOD_COUNT-1:0]; 
    input [1:0] EN [MOD_COUNT-1:0]; 
    output [WIDTH1-1:0] COUNT1; 
    output [WIDTH2-1:0] COUNT2; 

    genvar j; 

     generate 
     for(j = 0; j < MOD_COUNT; j++) begin: SC 
      TWO_SC #(.WIDTH1(WIDTH1), .WIDTH2(WIDTH2)) TWOCOUNTERS(.COUNT1(COUNT1), .COUNT2(COUNT2), .CLK(CLK), .al_RST(al_RST), .UPDN(UPDN[j]), .EN(EN[j])); 
     end 
     endgenerate 


endmodule 

//********************** 

module tb_GEN_SC(); 

parameter MOD_COUNT = 100; 
parameter WIDTH1 = 16; 
parameter WIDTH2 = 32; 

    reg CLK, al_RST; 
    reg [1:0] UPDN [MOD_COUNT-1:0]; 
    reg [1:0] EN [MOD_COUNT-1:0]; 
    wire [WIDTH1-1:0] COUNT1; 
    wire [WIDTH2-1:0] COUNT2; 

    GEN_SC #(.WIDTH1(WIDTH1), .WIDTH2(WIDTH2)) UUT(COUNT1, COUNT2, CLK, al_RST, UPDN, EN); 

    initial begin 
CLK = 1'b1; 
    forever 
    #5 CLK = ~CLK; 
    end 

    initial 
    $monitorb("%d COUNT = %b (%d) | UPDN = %b | EN = %b | COUNT = %b (%d) | UPDN = %b | EN = %b | al_RST = %b | CLK = %b", $time, UUT.SC[87].TWOCOUNTERS.COUNT1, UUT.SC[87].TWOCOUNTERS.COUNT1, UUT.SC[87].TWOCOUNTERS.UPDN[0], UUT.SC[87].TWOCOUNTERS.EN[0], UUT.SC[99].TWOCOUNTERS.COUNT1, UUT.SC[99].TWOCOUNTERS.COUNT1, UUT.SC[99].TWOCOUNTERS.UPDN[0], UUT.SC[99].TWOCOUNTERS.EN[0], al_RST, CLK); 

    initial begin 
    $vcdpluson; 
      UUT.SC[87].TWOCOUNTERS.GSC1.UPDN = 1; UUT.SC[99].TWOCOUNTERS.GSC1.UPDN = 1; EN = 0; al_RST = 1; 
    #10           UUT.SC[99].TWOCOUNTERS.GSC1.UPDN = 0;   al_RST = 0;   // RESET COUNTER 
    #10                     EN = 1; al_RST = 1;   // ENABLE COUNTER AND COUNT UP (HITS MAX) 
    #200 UUT.SC[87].TWOCOUNTERS.GSC1.UPDN = 0; UUT.SC[99].TWOCOUNTERS.GSC1.UPDN = 1; EN = 1;      // BEGIN TO COUNT DOWN 
    #10          EN = 0; 
    #60          EN = 3; 
//  #230 UPDN = 1; UPDN = 0; 
    #3017          al_RST = 0; 
    #100          al_RST = 1; 
    #20 $finish; 
    end  

/////////// Fehler ICH /////////////////

Error- [IBLHS-NT] Illegal Verhalten linke Seite tb_GEN_SC.sv, 34 Der Netzwerktyp kann auf der linken Seite dieser Zuweisung nicht verwendet werden. Der problematische Ausdruck lautet: tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.GSC1.UPDN Quellinfo: tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.GSC1.UPDN = 1;

Fehler- [IBLHS-NT] Ungültiges Verhalten linke Seite tb_GEN_SC.sv, 34 Der Netzwerktyp kann nicht auf der linken Seite dieser Zuweisung verwendet werden. Der problematische Ausdruck ist: tb_GEN_SC.UUT.SC [99] .TWOCOUNTERS.GSC1.UPDN Quelleninfo: tb_GEN_SC.UUT.SC [99] .TWOCOUNTERS.GSC1.UPDN = 1;

Error- [Iuda] Unverträgliche Abmessungen tb_GEN_SC.sv, 34 Unverträgliche entpackten Abmessungen in Zuordnung Arrays mit inkompatiblen entpackten Dimensionen können nicht in Zuordnungen verwendet werden, Initialisierungen und Instanziierungen.

Error- [ICTA] Unverträgliche komplexen Typ tb_GEN_SC.sv, 34 Unverträgliche komplexen Typ Zuordnung Art des Quellenausdruck ist mit der Art der Zielexpressions inkompatibel. Nicht übereinstimmende Typen können nicht in Zuweisungen, Initialisierungen und Instanziierungen verwendet werden. Der Typ des Ziels ist 'reg [1: 0] $ [99: 0]', während der Typ der Quelle 'int' ist. Quellausdruck: 0

Antwort

1

Sie haben nur einen UPDB- und einen EN-Port in der Portliste. Wie können Sie verschiedene Instanzen von UPDN und EN anwenden?

Eine Idee ist, ein Array mit der Größe von MOD_COUNT zu definieren, so dass jedes Element seinen eigenen Steuereingang hat. Dann können Sie in Genvar-Schleife den Index verwenden.wie folgt aus:

input [1:0] UPDN [MOD_COUNT-1:0]; 
input [1:0] EN [MOD_COUNT-1:0]; 

...

generate 
    for(j = 0; j < MOD_COUNT; j++) begin: SC 

    TWO_SC #(.WIDTH1(WIDTH1), .WIDTH2(WIDTH2)) TWOCOUNTERS(.COUNT1(COUNT1), 
.COUNT2(COUNT2), .CLK(CLK), .al_RST(al_RST),  .UPDN(UPDN[j]), .EN(EN[j])); 

end 
    endgenerate 
+0

Hey Laleh! Ich weiß es zu schätzen, dass Sie sich die Zeit genommen haben, mir zu helfen. Daran habe ich angefangen zu experimentieren. Ich verwende ein mehrdimensionales Array. Ich dachte daran, UPDN und EN 2 Bit breit zu haben, damit ein Bit für UPDN & EN den 2 Zählern entspricht, die ich in TWO_SC instanziiert habe. Also, was ich will, sollte sein: Eingabe [1: 0] UPDN [MOD_COUNT-1: 0] .. richtig? Gleiches für EN. – Braulio

+0

Ja, ich habe den Code geändert :) – Laleh

+0

Schön! Das war, was ich gemacht habe .. gut zu wissen! Jetzt habe ich Probleme in meinem Prüfstand beim Erstellen der Vektoren für jeden Zähler. Ich habe meinen Prüfstand oben bearbeitet. Kannst du bitte einen Blick darauf werfen? Ich weiß, es ist kein großartiger Teststand, aber es reicht fürs Erste. Dies ist ein Fehler und ich weiß, es ist, weil UPDN ist kein reg. Fehler- [IBLHS-NONREG] Illegal Verhalten der linken Seite tb_GEN_SC.sv, 35 Non-Reg-Typ ist nicht gültig auf der linken Seite davon Zuweisung Der problematische Ausdruck lautet: tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.UPDN [0] Quellinfo: tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.UPDN [0] = 1; – Braulio

Verwandte Themen