Различия в выборе бит в Verilog - PullRequest
0 голосов
/ 06 мая 2020

У меня есть код, похожий на следующий

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.

У меня нет тестовая площадка, потому что этот код является частью большого проекта. Я увидел проблему после моделирования и просмотра волн.

Что мне не хватает?

1 Ответ

1 голос
/ 06 мая 2020

Я подозреваю, что вам не хватает только 2 бита, используемых для вычисления ответа в «КОДЕ 2», потому что это так называемое самоопределяемое выражение . Итак, Verilog берет выражение:

counter[1:0]<<1

и ему нужно решить, сколько бит использовать для ответа. Вот что он делает: он смотрит, сколько битов находится в левой части оператора сдвига (2), и использует это для ввода результата. Как он мог сделать что-нибудь еще? Число бит в правой части (32) в основном не имеет значения (если вы не думаете, что Verilog должен использовать 2 ^ 31-1 бит для результата!). Итак, вы получаете переполнение - левая часть результата сдвига обрезается.

См. этот ответ здесь .

...