Условие создания if должно быть постоянным выражением

Я пытаюсь создать непосредственный генератор для сборки RISC-V, но я столкнулся с оператором if. Вот мой код в Verilog:

module signextend(in, out, sel);
    parameter nin = 32;
    parameter nout = 32;
    input [nin-1:nin-25] in;
    input [2:0] sel;
    output [nout-1:0] out;
    
    if (sel == 3'b000)
        begin
            assign out[19:0] = in[31:12];
            assign out[31:20] = {12{in[31]}};
        end
    else if (sel == 3'b001) 
        begin
            assign out[11:0] = in[31:20];
            assign out[31:12] = {20{in[31]}};
        end
    else if (sel == 3'b010)
        begin
            assign out[4:0] = in[24:20];
            assign out[31:5] = 0;
        end
    else if (sel == 3'b011)
        begin
            assign out[3:0] = in[11:8];
            assign out[4:9] = in[30:25];
            assign out[10] = in[7];
            assign out[11] = in[31];
            assign out[31:12] = {20{in[31]}};
        end
    else if (sel == 3'b100)
        begin
            assign out[4:0] = in[11:7];
            assign out[11:5] = in[31:25];
            assign out[31:12] = {20{in[31]}};
        end
    else if (sel == 3'b101)
        begin
            assign out[9:0] = in[21:30];
            assign out[10] = in[20];
            assign out[18:11] = in[19:12];
            assign out[19] = in[31];
            assign out[31:20] = {12{in[31]}};
        end 
    else 
        assign out = 32'hxxxx;  
endmodule

Проблема существует в каждом операторе if: условие создания if должно быть постоянным выражением.


person Khoa Trần    schedule 18.08.2020    source источник


Ответы (1)


Вам нужно поместить весь свой код в блок always и удалить assigns:

always @(*) begin
  if (sel == 3'b000)
      begin
          out[19:0] = in[31:12];
          out[31:20] = {12{in[31]}};
      end
  else if (sel == 3'b001) 
    // etc

Блок always содержит немного программного обеспечения (ваши if операторы), моделирующего немного оборудования (результирующую комбинационную логику).

Допустимо иметь оператор if вне блока always (или initial), но тогда это означает нечто иное. Тогда это означает условное включение оборудования, т.е. если какое-то условие истинно, включить это оборудование. Такое условие должно быть статическим, т. Е. Фиксироваться во время компиляции. Это не может быть ввод, как ваш sel. Если подумать, это имеет смысл: как вы могли создать какое-то оборудование, которое волшебным образом появляется и исчезает в зависимости от значения некоторого ввода? Вы не можете. Вот почему вы получаете свою ошибку.

Вам нужно удалить assigns, потому что, хотя разрешено иметь assign внутри блока always, это означает что-то странное. Никогда не делай этого.

person Matthew Taylor    schedule 18.08.2020