verilog里面genvar, generate的问题
时间:10-02
整理:3721RD
点击:
一段小程序,如下:
module VNP_cluster(DIN, counter, DOUT);
input [3:0]counter;
input[27:0]DIN;
output [27:0];
//有问题的一段,用红色标出来了
wire [3:0]counter_new;
genvar i;
generate
for(i=0;i<14;i=i+1) begin: VNP_c
assign counter_new=((counter+i)>=14)? (i+counter-14) :(i+counter);
VNP VNP_B( .DIN(DIN), .counter(counter_new), .DOUT(DOUT[2*i+1:2*i]) );
end
endgenerate
endmodule
VNP大概模块接口为:
module VNP( input [27:0]DIN,
input [3:0]counter,
output [1:0]DOUT);
就是generate里面调用VNP模块之前需要对其中一个输入counter进行检测和转换,如果(counter+i)大于等于14的话就减掉14再作为输入。
可是这样弄的话,最后VNP的输出全是X,相当于counter_new没被传到VNP的输入。
请问这种情况应该怎么解决啊?
我尝试过把counter_new设置为reg变量,这样的话直接报错。貌似只能是wire型的,但是好像wire型的又不能作为模块实例化时候的输入啊。
麻烦请高手指教!不知道问题在哪里,应该怎么改啊
这里的问题在于,counter_new应该是被multiple-driven(多驱动了),多个家伙驱动一个信号,所以变成X了,你仔细分析分析,是不是这样呢?每个i循环都只给counter_new赋值,可不是多驱动了?你可以试试把generate展开。
wire [3:0]counter_new;
genvar i;
generate
for(i=0;i<14;i=i+1) begin: VNP_c
assign counter_new[i ]=((counter+i)>=14)? (i+counter-14) :(i+counter);
VNP VNP_B( .DIN(DIN), .counter(counter_new[i ]), .DOUT(DOUT[2*i+1:2*i]) );
end
endgenerate
可以这样
LS说得没错,就是这原因。
使用generate,生成的代码会展开的,相当于按参数变量把里面的代码反复地写了N遍,而不是C语言里的变量按时间变化。
谢谢各位回复啊。
我开始的想法是:对于每个i,都对counter检测一次,得到counter_new直接就在下面被用掉了。
至于每次被赋新值没关系。
如果用二楼说的方法,估计最开始counter_new得设置成 wire [3:0] counter_new[13:0],感觉很浪费资源啊
多谢,正有此疑问,看到你的解答了
多谢!
