gpt4 book ai didi

verilog - 总是 block 中的for循环

转载 作者:行者123 更新时间:2023-12-02 04:57:49 30 4
gpt4 key购买 nike

我有一个高速缓存内存模块,我希望它是可字寻址的,但有字节的写使能信号。

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

如果我正在向内存写入一个单词,我可以指定应忽略哪些字节以及应在每个单词中写入哪些字节。我已经测试了这段代码,它模拟得很好。我想参数化一个字中有多少字节(在 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

我有一个名为 wordSize 的参数,它指定每个单词包含多少位(通常是 32 或 64)。还有一个参数就是parameter bytesPerWord = wordSize/8。当我尝试编译这个版本时,我收到一条错误消息,提示 i is not a constant。我也尝试过 genvargenerate 但这些在 always block 中是不允许的。有没有一种方法可以根据 bytesPerWord 参数生成我想要的硬件,或者我将不得不依赖一串丑陋的 `ifdef 语句?

最佳答案

您得到的错误 i is not a constant 是因为 verilog 不允许使用范围的上限值和下限值的动态值选择零件 (net[i:j] ),因为这将允许总线中的位数动态变化,这在硬件中是不可能的。

但是在您的特殊情况下,由于被选择的位数总是恒定的,您可以使用索引部分选择 运算符,它看起来像:

memData[lastInIndex][lastInOffset][i*8 +: 8];

这与您当前尝试做的事情相同(选择从 i*8 开始的 8 位),但它使用特殊的运算符来完成。

关于verilog - 总是 block 中的for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17661522/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com