2016-03-25 4 views
0

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

Кодекс, который мне нужно генерировать является частью государственной машины FSM для государства ST_DATA_CHECK:

always @(posedge ui_clk_sync_rst or posedge ui_clk) 
    begin 
    if (rst) begin 
     s_app_cmd   <= 3'b111; 
     s_app_en   <= 1'b0; 
end 
end else begin 
     case (ddr3_state) 
      ST_INIT : 
…. 
      ST_DATA_CHECK : // This part of the code, needs to make parameteric 
       if (~dwfifo_ef[0]) begin 
       s_data_write_active[0] <= 1'b1 ; 
       end else if (~dwfifo_ef[1]) begin 
       s_data_write_active[1] <= 1'b1 ; 
       end else if (~dwfifo_ef[2]) begin 
       s_data_write_active[2] <= 1'b1 ; 
       end else if (~d_rfifo_ef[0]) begin 
       s_data_read_active[0] <= 1'b1 ; 
       end else if (~d_rfifo_ef[1]) begin 
       s_data_read_active[1] <= 1'b1 ; 
       end 
      ST_WRITE : 
       … 
endcase 

Пожалуйста, обратите внимание, что, например dwfifo_ef [0] и dwfifo_ef [1] биты могут быть равны 0 в то же время, поэтому я должен использовать здесь приоритетный кодер.

Любая помощь/идея/предложение приветствуются о том, как я могу сделать код параметрическим.

Благодаря Hayk

ответ

1

Вы хотите for петли с break заявления:

ST_DATA_CHECK : 
       for (int i=0;i<$bits(dwfifi_ef);i++) 
       if (~dwfifo_ef[i]) begin 
       s_data_write_active[i] <= 1'b1 ; 
       break; 
       end 
+0

Спасибо Дейв для ответа Однако есть 2 вещи с вашей гуманного 1) в моем if есть 2 сигнала: s_data_write_active и s_data_read_active 2) Также я не уверен, что for-break является синтезируемым заявлением – haykp

+0

@haykp 'for' Loops можно обобщить. Параметры цикла должны быть статичными - необходимо четко понимать, сколько будет максимального количества итераций цикла. –

1

@ dave_59 только о решить вашу проблему, но, как вы говорите «в моем случае заявлений есть 2 сигналов s_data_write_active и s_data_read_active ", как насчет пробовать что-то вроде это?

ST_DATA_CHECK : 
       if (|dwfifo_ef == 1'b1) 
       for (int i=0;i<$bits(dwfifi_ef);i++) 
        if (~dwfifo_ef[i]) begin 
        s_data_write_active[i] <= 1'b1 ; 
        break; 
        end 
       else 
       for (int i=0;i<$bits(d_rfifo);i++) 
        if (~d_rfifo[i]) begin 
        s_data_read_active[i] <= 1'b1 ; 
        break; 
       end 

(я не пробовал компилировать, моделировать или synthsise это, следовательно, моя фраза что-то вроде.)

+0

Спасибо хорошо это могло бы работать, например, для моделирования он может дать хорошие результаты однако, как насчет синтеза и P & R? Я попытаюсь синтезировать это, чтобы увидеть, может ли for-break быть синтезируемым вообще – haykp

+0

@haykp Как я уже сказал, он должен синтезировать. Сообщите нам, как вы поживаете. –

+0

Работа! Я мог бы синтезировать его по Synplify Большое спасибо за помощь – haykp

Смежные вопросы