当我尝试使用 Verilog在门级创建左移位器时,出现了这个问题。要求是想出一个移位器,
- 用户可以以二进制指定移位量,最大为 32(10000b)
- 支持左移,即将 a[0] 的值移到 a[1] 中,并将 a[0] 填充为 1'b0,若移位量为 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”,第一个移位位是“阶段 1”移位,移位 2^0(1 位)如果移位“S1”,第二个移位位是“阶段 2”移位,移位 2^1(2 位)如果移位第三个移位位是“阶段 3”移位,移位 2^2(4 位)第四个移位位是“阶段 4”移位,移位 2^3(8 位),依此类推)
因此,当我在做作业时,我想重用我在生成块中声明的 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?
生成语句不是程序代码。生成
for
循环被展开,并被i
替换为常量。如果您计划嵌套 for 循环,则只需声明多个 genvar,但这里不需要。您也可以将
genvar
声明作为for
循环的一部分。如果您需要一个基于循环变量的值,请声明一个参数。