如何在Verilog中重用genvar?

问题描述 投票:0回答:1

当我尝试使用 verilog 在门级中创建左移位器时,提出了这个问题。 要求是拿出一个变速杆,

  • 用户可以以二进制指定移位量,最多 32 (10000b)
  • 支持左移,即将a[0]的值移到a[1],并用1'b0填充a[0],假设移位量为00001;如果移位量为 00000,则该值保持不变。

我使用多路复用器来帮助我进行转换。这是我正在使用的多路复用器的原理图,它是我的教授 Kaushik Patra 博士的视频截图 https://www.youtube.com/watch?v=-uDFf6bef_U&ab_channel=KaushikPatra%27sSJSUClassroom 模块名称:MUX1_2x1

这是 Dr.Patra 演示的支持 2 位移位量的移位器 “S0”是移位量的第一位,如果移位量位的值为1,那么我们在该“级”执行移位(即四位移位器有4级,即 “S0”,第一个移位位是“stage 1”移位,如果移位则移位2^0(1bit) “S1”第二个移位位是“stage 2”移位,如果移位则移位 2^1(2 位) 第三个移位位是“第 3 阶段”移位,移位 2^2(4 位) 第四个移位位是“第 4 阶段”移位,移位 2^3(8 位),依此类推)

2 位左移方案

所以,当我做作业时,我想重用我在生成块中声明的 genvar

//port list of MUX1_2x1: (Y,I0, I1, S)
// Y: output, I0, I1: input, S: control signal
// st1_result is a wire
//D[] is input of the shifter
//I0 is not shift, I1 is shift
genvar i; //for normal shifting bits
genvar j; //for zero filling bits
generate
    begin: first_stage_shift //shift amount = 1
        // first bit
        MUX1_2x1 inst_0(st1_result[0], D[0], 1'b0, S[0]);
        
        for (i = 1; i<32; i = i+1)
            MUX1_2x1 inst_1(st1_result[i], D[i], D[i-1], S[0]);
    end
// this is the line that has error (81)
    i=0; //reset the genvar
    begin: second_stage_shift //shift amount = 2
        // first bit 
        MUX1_2x1 inst_0(st2_result[0], St1_result[0], 1'b0, S[1]);
        // second bit 
        MUX1_2x1 inst_1(st2_result[1], St1_result[1], 1'b0, S[1]);
        
        for (i = 2; i<32; i = i+1)
            MUX1_2x1 inst_1(st2_result[i], st1_result[i], st1_result[i-2], S[1]);
    end

如屏幕截图中所示,我想通过写入 i=0 来重置 genvar,以便我可以在下一个 for 循环中使用它,但是,我在第 81 行收到此错误:

** Error: (vlog-13069) D:/barrel_shifter.v(81): near "=": syntax error, unexpected '='.
** Error: D:/barrel_shifter.v(81): (vlog-13205) Syntax error found in the scope following 'i'. Is there a missing '::'?

我在网上搜索了一下,但没有找到我要找的东西。 是否可以在verilog中重用/重置genvar,而不是声明多个genvar?

verilog system-verilog
1个回答
0
投票

生成语句不是过程代码。展开生成-

for
循环,并且
i
被替换为常量。

如果您打算嵌套 for 循环,则只需要多个 genvar 声明,但这里不是这种情况。您还可以将

genvar
声明作为
for
循环的一部分。

MUX1_2x1 inst_0(st1_result[0], D[0], 1'b0, S[0]);     
for (genvar i = 1; i<32; i = i+1) begin : first_loop
            MUX1_2x1 inst_1(st1_result[i], D[i], D[i-1], S[0]);
end

MUX1_2x1 inst_0(st2_result[0], St1_result[0], 1'b0, S[1]);
MUX1_2x1 inst_1(st2_result[1], St1_result[1], 1'b0, S[1]);
for (genvar i = 2; i<32; i = i+1) begin : second_loop
   MUX1_2x1 inst_1(st2_result[i], st1_result[i], st1_result[i-2], S[1]);
end

如果您需要一个基于循环变量的值,请声明一个参数。

for (genvar i = 2; i<32; i = i+1) begin : second_loop
   parameter i_minus_2 = i-2; // could be a function call too
   MUX1_2x1 inst_1(st2_result[i], st1_result[i], st1_result[i_minus_2], S[1]);
end
© www.soinside.com 2019 - 2024. All rights reserved.