2017-02-24 12 views
0

我在实例化模块时遇到了一个小问题。我正在使用一个生成循环来创建两个计数器的100个实例(16个32位计数器)。每个计数器应该有自己的独立控制(UPDN & EN),但它们共享一个时钟和一个复位。SystemVerilog实例化模块共享输入时,他们不应该(简单的解决方案)?

模块说明:

SAT_COUNTER.sv // SIMPLE计数器模块

TWO_SC.sv //实例TWO MODULES SAT_COUNTER(16位& 32 BIT COUNTERS)

GEN_SC.sv // INSTANTIATES 100个TWO_SC模块模块

tb_GEN_SC.sv // TESTBENCH

我相信,我的问题是GEN_SC模块在我实例全部100 ..

我明白任何帮助!先谢谢你!

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]非法行为左侧 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

您在端口列表中只有一个UPDB和一个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的一位对应于我在TWO_SC中实例化的2个计数器。所以,我想要的应该是:input [1:0] UPDN [MOD_COUNT-1:0] ..right?相同的EN。 – Braulio

+0

是的,我已经改变了代码:) – Laleh

+0

不错!这就是我去过的......很高兴知道!现在我在测试台上为每个计数器创建载体时遇到了麻烦。我编辑了上面的测试台。你可以看一下吗?我知道这不是一个很好的测试平台,但它现在会做。这是一个错误,我知道这是因为UPDN不是注册表。 错误 - [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

相关问题