Ошибка в простом цикле Verilog for

Я знакомлюсь с Verilog, выполняя небольшие упражнения, и прямо сейчас пытаюсь реализовать сдвиговый регистр с линейной обратной связью.

Я пытаюсь смоделировать цепочку триггеров внутри блока always с помощью цикла for, но iverilog продолжает выдавать ошибку register ``i'' unknown in lfsr, где "i" - переменная итерации и lfsr мой модуль.

always @(posedge clk or negedge res_n) begin
    if(res_n == 0) begin
        // ... implement reset
    end

    else begin
        flops[0] <= input_wire;
        for (i = 0; i <= width-2; i = i+1) begin
            flops[i+1] <= flops[i];
        end
    end

end

Может ли кто-нибудь помочь мне?

Спасибо.


person Jersey    schedule 30.01.2017    source источник


Ответы (2)


Вы должны сначала объявить переменную i, иначе i будет рассматриваться как регистр без спецификации. И это позволит компилятору вернуть ошибку unknown register.

Объявите i как целое число вне блока кода for, как показано ниже:

integer i;
person Haotian Liu    schedule 30.01.2017
comment
Это действительно помогло. Любопытно, что учебники Verilog, которые я читал, не говорили мне об этом. Это что-то, что зависит от компилятора? - person Jersey; 30.01.2017
comment
@Jersey Я не уверен, зависит ли это от компилятора. Но насколько я понимаю Verilog, чтобы не делать странных или загадочных ошибок или ошибок, вам лучше указать каждый регистр, провод или переменную как можно больше. - person Haotian Liu; 30.01.2017
comment
Это не зависит от компилятора: вам нужно объявить переменную цикла в цикле for. - person Matthew Taylor; 30.01.2017

Вам нужно объявить переменную цикла в цикле for, как указано в другом ответе. Однако это не обязательно должно быть за пределами блока always. Вместо этого, если (и только если) вы пометите блок begin...end, вы можете объявить переменную цикла внутри него. Это объявление должно быть первым внутри блока. Это имеет преимущество лучшей инкапсуляции:

always @(posedge clk or negedge res_n) begin
    if(res_n == 0) begin
        // ... implement reset
    end

    else begin : SOME_NAME
//                   ^
//                   |
//             this is a label

        integer i;     // declaring i here results in better encapsulation
                       // the declaration HAS to be before "imperative" (ie executable) code

        flops[0] <= input_wire;
        for (i = 0; i <= width-2; i = i+1) begin
            flops[i+1] <= flops[i];
        end
    end

end
person Matthew Taylor    schedule 30.01.2017