for always in always block

时间:2013-07-15 18:42:18

标签: verilog

我有一个高速缓冲存储器模块,我想要字可寻址,但有字节的写使能信号。

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块中不允许这些。有没有办法根据bytesPerWord参数生成我想要的硬件,或者我将不得不依赖于一串丑陋的`ifdef语句?

1 个答案:

答案 0 :(得分:5)

你得到的错误i is not a constant是因为verilog不允许对范围的上限值和下限值的动态值进行部分选择(net[i:j]),因为这将允许位数要动态改变的总线,这在硬件中是不可能的。

然而,在您的特殊情况下,由于选择的位数始终是常量,您可以使用 索引部分选择 运算符,如下所示:

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

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

相关问题