Ошибка (10734): Ошибка HDL Verilog на mv (156): cnt не является константой - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужно записать 4 байта из входных контактов в разные части регистра в зависимости от счетчика, с кодом, который у меня сейчас есть, я получаю эту ошибку:
Ошибка (10734): Ошибка HDL Verilog на mv (156): cnt не является константой
Как с этим бороться?

wire wren, rst;     
wire [3:0] abcd;    
reg [31:0] my_reg;    
reg [3:0] cnt;   


always @(posedge wren or posedge rst)   
begin   
   if (rst == 1) 
   begin 
      my_reg <= 0; 
   end    
   else 
   begin   
      if (wren == 1) 
      begin    
         my_reg [4*cnt+3:4*cnt] <= abcd;   
      end   
   end          
end  

1 Ответ

0 голосов
/ 07 февраля 2019

Что касается вашей ошибки: вы должны использовать синтаксис +: [4 * cnt +: 4]. См. здесь для получения дополнительной информации.

Даже , если , что будет семантически разрешено, ваши значения будут неверными:

  • [4*cnt-1:4*cnt] даст низкий: высокий индекс, например, если cnt= 1 вы получаете [3: 4]

  • [4*cnt-1:4*cnt] дает отрицательный индекс, если cnt == 0 [-1: 0], который находится за пределами диапазона [31: 0] изreg.

Вы, вероятно, хотели использовать [4*cnt+3:4*cnt]

Но у вас есть и другие ошибки.

Во-первых, это очень опасно для использованияключевое слово для переменной.(reg)

Во-вторых, вы тактируете, используя не тактовый сигнал: wren.Это создает другое дерево часов.Обычная процедура - использовать if со стандартными системными часами:

always @(posedge clk or posedge rst)   
begin   
   if (rst == 1) 
   begin 
      my_reg <= 0; 
   end    
   else 
   begin   
      if (wren == 1) 
      begin    
         my_reg [4*cnt +: 4] <= abcd;   
      end   
   end          
end  
...