SystemVerilog

时间:2017-10-09 23:12:23

标签: verilog system-verilog

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

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个案例。

提前致谢。

1 个答案:

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