我在实例化模块时遇到了一个小问题。我正在使用一个生成循环来创建两个计数器的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
嘿拉尔赫!我感谢您花时间帮助我。这就是我已经开始尝试的。我正在使用多维数组。我想UPDN和EN是2位宽,所以UPDN和EN的一位对应于我在TWO_SC中实例化的2个计数器。所以,我想要的应该是:input [1:0] UPDN [MOD_COUNT-1:0] ..right?相同的EN。 – Braulio
是的,我已经改变了代码:) – Laleh
不错!这就是我去过的......很高兴知道!现在我在测试台上为每个计数器创建载体时遇到了麻烦。我编辑了上面的测试台。你可以看一下吗?我知道这不是一个很好的测试平台,但它现在会做。这是一个错误,我知道这是因为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