自动Verilog代码生成问题

自动Verilog代码生成问题,verilog,system-verilog,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;

我试图使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
始终@(posedge用户界面时钟同步或posedge用户界面时钟)
开始
如果(rst)开始

s_app_cmd您想要一个
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 
ST_数据检查:

对于(int i=0;i您需要一个带有
break
语句的
for
循环:

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 
ST_数据检查:

对于(int i=0;i@dave\u 59刚刚解决了您的问题,但正如您所说的“在我的if语句中有两个信号s\u data\u write\u active和s\u data\u read\u active”,尝试类似的方法怎么样

ST_数据检查:
如果(| dwfifo_ef==1'b1)

对于(int i=0;i@dave\u 59刚刚解决了您的问题,但正如您所说的“在我的if语句中有两个信号s\u data\u write\u active和s\u data\u read\u active”,尝试类似的方法怎么样

ST_数据检查:
如果(| dwfifo_ef==1'b1)

对于(int i=0;答案为Dave,但您的解决方案有2项1)在我的if语句中有2个信号s_data_write_active和s_data_read_active 2)此外,我不确定是否为休息合成statement@haykp
for
循环是可合成的。循环参数需要是静态的-需要非常清楚循环的最大迭代次数。感谢Dave的回答,但是您的解决方案中有两项1)在我的if语句中有两个信号s_data_write_active和s_data_read_active 2),我也不确定for break是否可合成statement@haykp
for
循环是可合成的。循环参数需要是静态的-它需要非常清楚循环的最大迭代次数是多少。多亏了这可能会起作用,也就是说,对于模拟,它可以给出很好的结果。但是,合成和P&R呢?我将试着合成这个,看看是否为休息是合成的all@haykp正如我所说,它应该合成。让我们知道你进展如何。工作!我可以通过合成来合成它,非常感谢您的帮助。谢谢,这可能会起作用,也就是说,对于模拟,它可以给出很好的结果。但是,合成和P&R呢?我将试着合成这个,看看是否为休息是合成的all@haykp正如我所说,它应该合成。让我们知道你进展如何。工作!我可以通过合成合成来合成它非常感谢你的帮助