У меня есть код, похожий на следующий
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, и т.д. c. И я ожидал, что КОД 1 и КОД 2 будут вести себя одинаково, но когда счетчик равен 2 и 6 (счетчик [1: 0] равен 2), я попал в регистр 2'h1 в КОДЕ 1 (правильно) и 2'h0 в КОДЕ 2 ( неправильно).
Я еще не проверил, что будет, если счетчик идет 0, 1, ..., 7, 0, 1, и т.д. c.
У меня нет тестовая площадка, потому что этот код является частью большого проекта. Я увидел проблему после моделирования и просмотра волн.
Что мне не хватает?