gpt4 book ai didi

verilog - Always block 中的 For 循环

转载 作者:行者123 更新时间:2023-12-02 21:56:39 24 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 不是常量。我也尝试过 genvargenerate 但这些在always block 中是不允许的。有没有办法根据 bytesPerWord 参数生成我想要的硬件,或者我是否必须依赖于丑陋的 `ifdef 语句字符串?

最佳答案

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

但是,在您的特殊情况下,由于选择的位数始终恒定,因此您可以使用索引部分选择运算符,如下所示:

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

这与您当前尝试执行的操作相同(选择从 i*8 开始的 8 位),但它使用特殊运算符来执行此操作。

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

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