Verilog For始终循环块

Verilog For始终循环块,verilog,Verilog,我有一个高速缓存模块,我想字寻址,但有写使能信号字节 always @ (posedge clk) begin //stuff... if(write) begin //Word accessible only //memData[lastInIndex][lastInOffset] <= lastWriteData; //Supporting byte accessible if(lastWrEn[0])

我有一个高速缓存模块,我想字寻址,但有写使能信号字节

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。当我试图编译这个版本时,我得到一个错误,它说我不是常数。我也尝试过genvar和generate,但在always块中不允许使用它们。有没有一种方法可以根据bytesPerWord参数生成我想要的硬件,或者我必须依赖一个丑陋的“ifdef语句”字符串?

您得到的错误不是常数,因为verilog不允许使用范围网[I:j]的上下值的动态值进行部分选择,因为这将允许总线中的位数动态变化,这在硬件中是不可能的

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

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


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

现在有一个模糊的语法,在我阅读的任何教程中都没有记录!lol tyvmIt在技术上是Verilog2001的一个特性,所以它可能不是非常古老的教程的一部分。