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
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
Ja, ich habe den Code geändert :) – Laleh
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