问题描述
我对 Verilog 还很陌生,我正在尝试从不同的参数生成一个数组。
我想要做的是组装参数中定义的列表,用分隔符 (3'b000) 将它们分开。我有 X 个从站,每个从站都有 Y 个地址。难点是我不知道每个从站会有多少地址。这就是我想要的(使用从参数自动生成的generatedReg):
parameter numberOfSlaves=3;
parameter numberofAddr=5;
parameter [1:0] listAddrForSlave1=[3'bxxx,3'bxxx]
parameter [0:0] listAddrForSlave2=[3'bxxx]
parameter [1:0] listAddrForSlave3=[3'bxxx,3'bxxx]
reg [numberofSlaves+numberofAddr-1:0] generatedReg=[3'bxxx,3'bxxx,3'b000,3'b000]
所以在参数中,我也可以有 listAddrForSlave4 并且它应该附加到generatedReg(使用相同的代码)。我想要的是生成一个数组,而无需用户放置分隔符。 请问我该怎么做?你对我有什么反应吗?
我希望这次编辑更清楚。
谢谢,祝你有个美好的一天
解决方法
您的 listAddrForSlave...
变量是不规则的(具有不同的宽度)。因此,在 verilog 中是不可能做到的。对于常规变量,您可以使用参数数组和参数化模块。数组的大小可以在实例化时定义。类似以下内容可能会对您有所帮助。
module ctrl #(int numberOfSlaves = 1,int numberOfAddr=1)();
parameter [1:0] listAddrForSlave[numberOfSlaves] = '{default: 3'bxxx}; //initialize all elements of an array with a default value.
reg [numberOfSlaves+numberOfAddr-1:0] generatedReg; // it will be 'x' by default.
//...
endmodule
上述模块可以使用不同的参数进行实例化。
module top();
ctrl ctrl1(); // instantiation with default values
ctrl #(.numberOfSlaves(3)) ctl1(); // instantiation with 3 slaves (and one address)
//...
endmodule