自动Verilog代码生成问题

时间:2016-03-25 06:07:49

标签: verilog system-verilog

我正在尝试生成FSM状态参数或自动。 我尝试了很多方法,似乎没有办法生成我需要的代码。 有人可以帮忙吗?

我需要生成的代码是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酒店

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

@ dave_59刚刚解决了你的问题,但正如你所说&#34;在我的if语句中有2个信号s_data_write_active和s_data_read_active&#34;,如何尝试类似这个?< / p>

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 

(我没有尝试编译,模拟或合成这个,因此我的短语类似。)