【发布时间】:2020-05-06 14:30:34
【问题描述】:
我有类似下面的代码
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
Counter 是 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 等时的行为是什么。
我没有测试平台,因为这段代码是一个大型项目的一部分。我在模拟和看到波浪后看到了问题。
我错过了什么?
【问题讨论】:
-
我已经更新了这个问题,掩码值为 0x50(它在代码中的其他地方设置)但就这个问题而言,它可以是一个 8 位的常量值。
-
您示例中的代码没有意义。所有这些引用的字符串是什么意思?
-
引用的字符串是占位符。在我的代码中,我有其他变量的分配,但这无关紧要
-
我已经更新了代码。希望它更清楚。