Module SystemVerilog实例化模块在不应共享输入时共享输入';t(简易解决方案)?

Module SystemVerilog实例化模块在不应共享输入时共享输入';t(简易解决方案)?,module,counter,instantiation,system-verilog,hdl,Module,Counter,Instantiation,System Verilog,Hdl,我在实例化模块时遇到了一个小问题。我使用generate循环创建2个计数器(16和32位计数器)的100个实例。每个计数器都应该有自己的独立控件(UPDN&EN),但它们共享一个时钟和一个复位 模块说明: SAT_COUNTER.sv//简单计数器模块 TWO_SC.sv//实例化两个SAT_计数器模块(16位和32位 (计数器) GEN_SC.sv//实例化两个_SC模块中的100个模块 tb\U GEN\U SC.sv//试验台 我确信我的问题出在GEN_SC模块中,我在该模块中实例化了所有

我在实例化模块时遇到了一个小问题。我使用generate循环创建2个计数器(16和32位计数器)的100个实例。每个计数器都应该有自己的独立控件(UPDN&EN),但它们共享一个时钟和一个复位

模块说明:

SAT_COUNTER.sv//简单计数器模块

TWO_SC.sv//实例化两个SAT_计数器模块(16位和32位 (计数器)

GEN_SC.sv//实例化两个_SC模块中的100个模块

tb\U GEN\U SC.sv//试验台

我确信我的问题出在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    
模块SAT\u计数器(
计数,//可伸缩计数输出
时钟,//时钟
al_RST,//低电平有效复位
UPDN,//计数器将计数:UP=1;DN=0;
EN);//使可能
参数宽度=8;
输入CLK、al_RST、UPDN、EN;
输出寄存器[WIDTH-1:0]计数;
...
端模
//**********************
模块二(
COUNT1,//N位计数器输出
COUNT2,//M位计数器输出
时钟,//时钟
al_RST,//有源-低电平复位
UPDN,//DIR.CONTROL
EN);//使可能
参数宽度1=16;
参数宽度2=32;
输入时钟、警报;
输入[1:0]UPDN,EN;
输出[WIDTH1-1:0]计数1;
输出[WIDTH2-1:0]计数2;
卫星计数器(宽度1)GSC1(.COUNT(COUNT1),.CLK(CLK),.al_RST(al_RST),.UPDN(UPDN[0]),.EN(EN[0]);
卫星计数器(宽度2)GSC2(.COUNT(COUNT2),.CLK(CLK),.al_RST(al_RST),.UPDN(UPDN[1]),.EN(EN[1]);
端模
//**********************
模块GEN_SC(
COUNT1,//COUNT1
COUNT2,//COUNT2
时钟,//时钟
al_RST,//有源-低电平复位
UPDN,//DIR.CONTROL
EN);//使可能
参数MOD_COUNT=100;
参数宽度1=16;
参数宽度2=32;
输入时钟、警报;
输入[1:0]UPDN[MOD_COUNT-1:0];
输入[1:0]EN[MOD_COUNT-1:0];
输出[WIDTH1-1:0]计数1;
输出[WIDTH2-1:0]计数2;
genvar j;
生成
对于(j=0;j
///////////我犯的错误/////////////////

错误-[IBLHS-NT]左侧非法行为 tb_GEN_SC.sv,34岁 网络类型不能用于此分配的左侧。 有问题的表达式是:tb_GEN_SC.UUT.SC[87].twoccounters.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].twoccounters.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

端口列表中只有一个UPDB和一个EN端口。那么您如何将不同的UPDN和EN应用于实例呢

一个想法是定义一个大小为MOD_COUNT的数组,这样每个元素都有自己的控制输入。然后在genvar循环中可以使用索引。像这样:

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

生成
对于(j=0;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