2017-10-09 9 views
-2

순차 논리 내부에 case 문이 있습니다 (항상 블록이 clock의 posedge에서 활성화 됨). 이 케이스는 매개 변수 PARAM에 따라 비트 폭이 다른 변수 var을 평가합니다. var 가능한 값을 모두 커버해야 case 문에 걸릴 수 있으며 값은 PARAM에 따라 다릅니다. 예를 들어, PARAM이 32이면 var은 5 비트이므로 32 개가 있어야합니다. PARAM이 16 인 경우 var은 4 비트이며 16 개의 사례가 필요합니다. 이 case 문은 또한 if 문이 중첩되어 있기 때문에 순차 논리 외부로 가져 오는 방법을 생각하기가 어렵습니다 (조건부 generate 문에 대해 이미 생각했습니다). 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 아래의 구조에 대한 의사 코드이다 : PARAM은 기본 값을 취하는 경우, 위의 예에서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 

는, (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

안녕 Dave! 더 명확하게 질문을 수정했습니다. 처음에는 문제를 설명하는 데 최선의 노력을 다하지 못한 것에 대해 사과드립니다. 도와 주셔서 감사합니다! –