2017-02-24 6 views
0

ここで私のモジュールをインスタンス化したときの小さな問題があります。私は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

答えて

1

ポートリストに1つのUPDBと1つのENポートがあります。では、どのように異なるUPDNとENをインスタンスに適用するのですか?

考えられるのは、各要素が独自の制御入力を持つように、サイズがMOD_COUNTの配列を定義することです。 genvarループでインデックスを使用することができます。

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

ねえラーレ:このように!私はあなたが私を助けるために時間を割いていただきありがとうございます。それが私が試し始めたものです。私は多次元配列を使用しています。私はUPDNとENを2ビット幅にしてUPDN&ENの1ビットがTWO_SCでインスタンス化した2つのカウンタに対応すると考えました。だから、私がしなければならないのは:input [1:0] UPDN [MOD_COUNT-1:0] ..right? ENと同じです。 – Braulio

+0

うん、私はコードを変更しました:) – Laleh

+0

ニース!それは私が行ったことです..知っておいてよかった!今、テストベンチで各カウンタのベクトルを作成する際に問題があります。上のテストベンチを編集しました。どうぞご覧ください。私はそれが素晴らしいテストベンチではないことを知っていますが、それは今のところ行います。これはエラーです。なぜなら、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

関連する問題