Verilog 中位选择的差异
Diference in bit selection in Verilog
我有一个类似下面的代码
module testModule(
input Clk,
input [2:0] Counter,
output [1:0] OutVar1,
output [1:0] OutVar2
);
localparam logic [7:0] mask = 8'h50;
// CODE 1
always_ff @(posedge Clk) begin
case (mask[{Counter[1:0], 1'b0} +: 2])
2'h0 : OutVar1 <= 2'h0;
2'h1 : OutVar1 <= 2'h1;
2'h2 : OutVar1 <= 2'h2;
2'h3 : OutVar1 <= 2'h3;
default: OutVar1 <= 2'hX;
endcase
end
// CODE 2
always_ff @(posedge Clk) begin
case (mask[(Counter[1:0]<<1) +: 2])
2'h0 : OutVar2 <= 2'h0;
2'h1 : OutVar2 <= 2'h1;
2'h2 : OutVar2 <= 2'h2;
2'h3 : OutVar2 <= 2'h3;
default: OutVar2 <= 2'hX;
endcase
end
endmodule
计数器是输入 0、2、4、6、0、2、4 等。
我希望 CODE 1 和 CODE 2 的行为相同,但是当计数器为 2 和 6(计数器 [1:0] 为 2)时,我在 CODE 1 中遇到了 2'h1(正确),在 CODE 2 中遇到了 2'h0(错误)。
我还没有检查如果计数器变为 0、1、...、7、0、1 等时的行为是什么
我没有测试平台,因为此代码是大型项目的一部分。仿真后看到了问题,看到了海浪
我错过了什么?
我怀疑你没有注意到 "CODE 2" 中只有 2 位用于计算答案,因为它是所谓的 自定表达式 。因此,Verilog 采用表达式:
counter[1:0]<<1
并且需要决定使用多少位作为答案。这就是它的作用:它查看移位运算符 (2) 左侧有多少位,并使用它来放入结果。它还能做其他事情吗?右侧的位数 (32) 基本上是无关紧要的(除非您认为 Verilog 应该使用 2^31-1 位作为结果!)。因此,您会遇到溢出 - 移位结果的左侧被截断了。
参见this answer here。
我有一个类似下面的代码
module testModule(
input Clk,
input [2:0] Counter,
output [1:0] OutVar1,
output [1:0] OutVar2
);
localparam logic [7:0] mask = 8'h50;
// CODE 1
always_ff @(posedge Clk) begin
case (mask[{Counter[1:0], 1'b0} +: 2])
2'h0 : OutVar1 <= 2'h0;
2'h1 : OutVar1 <= 2'h1;
2'h2 : OutVar1 <= 2'h2;
2'h3 : OutVar1 <= 2'h3;
default: OutVar1 <= 2'hX;
endcase
end
// CODE 2
always_ff @(posedge Clk) begin
case (mask[(Counter[1:0]<<1) +: 2])
2'h0 : OutVar2 <= 2'h0;
2'h1 : OutVar2 <= 2'h1;
2'h2 : OutVar2 <= 2'h2;
2'h3 : OutVar2 <= 2'h3;
default: OutVar2 <= 2'hX;
endcase
end
endmodule
计数器是输入 0、2、4、6、0、2、4 等。 我希望 CODE 1 和 CODE 2 的行为相同,但是当计数器为 2 和 6(计数器 [1:0] 为 2)时,我在 CODE 1 中遇到了 2'h1(正确),在 CODE 2 中遇到了 2'h0(错误)。
我还没有检查如果计数器变为 0、1、...、7、0、1 等时的行为是什么
我没有测试平台,因为此代码是大型项目的一部分。仿真后看到了问题,看到了海浪
我错过了什么?
我怀疑你没有注意到 "CODE 2" 中只有 2 位用于计算答案,因为它是所谓的 自定表达式 。因此,Verilog 采用表达式:
counter[1:0]<<1
并且需要决定使用多少位作为答案。这就是它的作用:它查看移位运算符 (2) 左侧有多少位,并使用它来放入结果。它还能做其他事情吗?右侧的位数 (32) 基本上是无关紧要的(除非您认为 Verilog 应该使用 2^31-1 位作为结果!)。因此,您会遇到溢出 - 移位结果的左侧被截断了。
参见this answer here。