Module SystemVerilog实例化模块在不应共享输入时共享输入';t(简易解决方案)?
我在实例化模块时遇到了一个小问题。我使用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 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模块中,我在该模块中实例化了所有
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