我正在尝试使FSM状态的生成参数化或自动化。我尝试了很多方法,但似乎没有办法生成我需要的代码。有人能帮帮忙吗?
我需要生成的代码是ST_DATA_CHECK状态的FSM状态机的一部分:
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和dwfifo_ef1位可以同时为0,所以这就是为什么我需要在这里使用优先级编码器。
欢迎任何关于我如何使代码参数化的帮助/想法/建议。
谢谢,海克
发布于 2016-03-25 14:41:49
您需要一个带有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 发布于 2016-03-25 16:04:29
@dave_59刚刚解决了您的问题,但是正如您所说的“在我的if语句中有两个信号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 (我没有试图编译、模拟或综合这一点,因此我的短语类似于。)
https://stackoverflow.com/questions/36214909
复制相似问题