我有一个高速缓存存储器模块,我想要字可寻址,但有字节的写使能信号.
always @ (posedge clk) begin
//stuff...
if(write) begin
//Word accessible only
//memData[lastInIndex][lastInOffset] <= lastWriteData;
//Supporting byte accessible
if(lastWrEn[0])
memData[lastInIndex][lastInOffset][7:0] <= lastWriteData[7:0];
if(lastWrEn[1])
memData[lastInIndex][lastInOffset][15:8] <= lastWriteData[15:8];
if(lastWrEn[2])
memData[lastInIndex][lastInOffset][23:16] <= lastWriteData[23:16];
if(lastWrEn[3])
memData[lastInIndex][lastInOffset][31:24] <= lastWriteData[31:24];
end
//more stuff...
end
Run Code Online (Sandbox Code Playgroud)
如果我正在向存储器写一个字,我可以指定应该忽略哪些字节以及应该在每个字中写入哪些字节.我已经测试了这段代码,它模拟得很好.我想参数化一个字中有多少字节(在64位情况下,现在每个字有8个字节).我希望有一些for循环来实例化我的逻辑,而不是仅仅复制和粘贴更几乎相同的行.
always @ (posedge clk) begin
//stuff...
if(write) begin
//Word accessible only
//memData[lastInIndex][lastInOffset] <= lastWriteData;
//Supporting byte accessible
begin : BYTE_SELECTION_GENERATE
integer i;
for(i=0; i<bytesPerWord; i=i+1)
if(lastWrEn[i])
memData[lastInIndex][lastInOffset][i*8+7:i*8] <= lastWriteData[i*8+7:i*8];
end
end
//more stuff...
end
Run Code Online (Sandbox Code Playgroud)
我有一个名为的参数wordSize,指定每个单词包含多少位(通常为32或64).还有另一个参数parameter bytesPerWord = wordSize/8.当我尝试编译这个版本时,我收到一个错误i is not a constant.我也试过了genvar,generate但总是阻止那些.有没有办法根据bytesPerWord参数生成我想要的硬件,或者我将不得不依赖丑陋的`ifdef语句串?
i is not a constant您得到的错误是因为verilog不允许使用动态值对range(net[i:j])的上限值和下限值进行部分选择,因为这将允许总线中的位数动态更改,这在硬件中是不可能的.
但是在您的特殊情况下,由于选择的位数始终是常量,您可以使用索引部分选择运算符,如下所示:
memData[lastInIndex][lastInOffset][i*8 +: 8];
这与您当前尝试做的事情相同(从i*8开始选择8位),但它使用特殊运算符来执行此操作.