2017-10-09 1466 views
-2

我在时序逻辑中有一个case语句(在时钟的posedge处激活一个always块)。该案例正在评估一个变量var,其位宽取决于参数PARAM。我需要涵盖var在案例陈述中可能采用的所有可能值,该值根据PARAM的值而不同。例如,如果PARAM是32,var是5位宽,所以必须有32个情况。如果PARAM是16,则var是4位宽,需要16个案例。这种情况下的陈述也嵌入了一系列陈述中,使我很难想出一种将它带入时序逻辑之外的方法(我已经考虑过有条件的generate陈述了)。任何想法如何做到这一点?下面是结构的伪代码:SystemVerilog中与参数相关的case语句

module a 
#(parameter PARAM = 8, 
    parameter WIDTH = $clog2(PARAM) 
) 
... 
input logic [WIDTH-1:0] var 
... 
always @(posedge clk) 
    begin 
    if(...) 
     begin 
     if(...) 
      begin 
      case(var) 
       3'd0: 
       3'd1: 
       3'd2: 
       3'd3: 
       3'd4: 
       3'd5: 
       3'd6: 
       3'd7: 
       default: 
      endcase 
      end 
     end 
    end 

在上面的例子中,如果PARAM需要它的默认值(8),应该有8例。但是,如果PARAM在实例化时为4,则应该只有4个例子。

在此先感谢。

+0

你将需要展示一个代码的样子。如何参数化每个案例项目中的代码? –

+1

Verilog中没有这样的东西。您的问题很可能有不同的解决方案,但您需要提供一个示例来了解它。在最糟糕的情况下,您可能会使用脚本或其他方法生成verilog代码。 – Serge

+0

如果你想要一个很好的答案,你将不得不付出一些努力来展示一个剥离IP的例子。 –

回答

0

如果你解释val,a,b,c和d是什么,那真的很有帮助。这里是我能做的最好的

always @(posedge clk) 
    begin 
    if(...) 
     begin 
     if(...) 
      begin 
      if (param == 1 && (var inside {a,b})) 
       branch = var; 
      else 
       branch = a_value_that_is_not_a,b,c,d; 
      case(branch) 
       a: 
       b: 
       c: 
       d: 
       default: 
      endcase 
      end 
     end 
    end 
+0

嗨,戴夫!我已经修改了这个问题,以便更清楚。我很抱歉没有做出最好的描述问题的工作。谢谢您的帮助! –