ここで私のモジュールをインスタンス化したときの小さな問題があります。私は2つのカウンタ(16 & 32ビットカウンタ)の100インスタンスを作成するために生成ループを使用しています。各カウンタには独自のコントロール(UPDN & EN)が必要ですが、クロックとリセットを共有します。SystemVerilogインスタンシエートされたモジュールは入力を共有しないでください(簡単なソリューション)?
モジュールの説明:
SAT_COUNTER.sv // SIMPLEカウンタモジュール
TWO_SC.sv // TWO SAT_COUNTERモジュール(16 BIT & 32 BIT COUNTERS)
をインスタンス化GEN_SC.sv // 2モジュールの100モジュールを置換する
tb_GEN_SC.sv //テストベンチ
私は任意の助けに感謝..
私の問題は、私はすべての100をインスタンス化GEN_SCモジュールであることを確信しています!前もって感謝します!
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
///////////私は/////////////////
エラー - [IBLHS-NT]不正GETエラー行動の左側 tb_GEN_SC.sv、34 この割り当ての左側では、ネットタイプは使用できません。 問題のある式は次のとおりです。tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.GSC1.UPDN ソース情報:tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.GSC1.UPDN = 1;
エラー - [IBLHS-NT]不正行動左側 tb_GEN_SC.sv、34 ネットタイプはこの割り当ての左側で使用することができません。 問題のある式は次のとおりです。tb_GEN_SC.UUT.SC [99] .TWOCOUNTERS.GSC1.UPDN ソース情報:tb_GEN_SC.UUT.SC [99] .TWOCOUNTERS.GSC1.UPDN = 1;
エラー - [IUDA】互換性のない寸法 tb_GEN_SC.sv、割り当て34の 互換性アンパック寸法互換性のないアンパック寸法の 配列が割り当てに使用することができない、 初期化及びインスタンス化。
エラー - [ICTA】互換性のない複合型 tb_GEN_SC.sv、34 ソース式の互換性のない複合型割り当て タイプ標的発現のタイプと互換性がありません。 割り当て、初期化、および インスタンシエーションで、不一致型を使用できません。ターゲットのタイプは 'reg [1:0] $ [99:0]'ですが、ソースのタイプ は 'int'です。 ソース式:0
ねえラーレ:このように!私はあなたが私を助けるために時間を割いていただきありがとうございます。それが私が試し始めたものです。私は多次元配列を使用しています。私はUPDNとENを2ビット幅にしてUPDN&ENの1ビットがTWO_SCでインスタンス化した2つのカウンタに対応すると考えました。だから、私がしなければならないのは:input [1:0] UPDN [MOD_COUNT-1:0] ..right? ENと同じです。 – Braulio
うん、私はコードを変更しました:) – Laleh
ニース!それは私が行ったことです..知っておいてよかった!今、テストベンチで各カウンタのベクトルを作成する際に問題があります。上のテストベンチを編集しました。どうぞご覧ください。私はそれが素晴らしいテストベンチではないことを知っていますが、それは今のところ行います。これはエラーです。なぜなら、UPDNはregではないからです。 エラー - [IBLHS-NONREG]不正な動作の左手側 tb_GEN_SC.sv、35 非reg型はこの左側には無効です代入 問題のある式は次のとおりです。tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.UPDN [0] ソース情報:tb_GEN_SC.UUT.SC [87] .TWOCOUNTERS.UPDN [0] = 1; – Braulio