2015-01-08 2 views
0

특정 계층 구조를 탐구해야하는 작업을 작성하려고합니다. 특정 인스턴스의 다른 핀을 간결하게 비교할 수 있습니다. (가 아닌 상수 레지스터를 할당 받아 들일 것을 주장상수 표현을위한 피연산자가 올바르지 않습니다.

task check_expected; 
    input integer pin; 
    input [9:0] expected; 
    integer i, j; 
    reg [9:0] check; 
    begin 
    j = 0; 

    for (i = 0; i < 20; i = i + 1) begin 
     case (pin) 
     0: begin 
      check[0] = test.inst[i].lane_0.PIN_FIRST; 
      check[1] = test.inst[i].lane_1.PIN_FIRST; 
      ... 
      check[9] = test.inst[i].lane_9.PIN_FIRST; 
     end 
     1: begin 
      check[0] = test.inst[i].lane_0.PIN_SECOND; 
      check[1] = test.inst[i].lane_1.PIN_SECOND; 
      ... 
      check[9] = test.inst[i].lane_9.PIN_SECOND; 
     end 
     ... 
     9: begin 
      check[0] = test.inst[i].lane_0.PIN_TENTH; 
      check[1] = test.inst[i].lane_1.PIN_TENTH; 
      ... 
      check[9] = test.inst[i].lane_9.PIN_TENTH; 
     end 
     endcase 

     if (check[0] !== expected[j*10 + 0]) begin 
     TEST_FAILED = TEST_FAILED + 1; 
     $display("ERROR Expected=%b, @ %0t",expected[j*10 + 0],$time); 
     end 
     if (check[1] !== expected[j*10 + 1]) begin 
     TEST_FAILED = TEST_FAILED + 1; 
     $display("ERROR Expected=%b, @ %0t",expected[j*10 + 1],$time); 
     end 
     ... 
     if (check[9] !== expected[j*10 + 9]) begin 
     TEST_FAILED = TEST_FAILED + 1; 
     $display("ERROR Expected=%b, @ %0t",expected[j*10 + 9],$time); 
     end 
    end 
    end 
endtask 

불행하게도, 위의 작업을 수행하려고 시도하는 것은 정교 동안 NOTPAR 오류가 발생합니다 : 특히, 나는 다음과 같은 일을하고 싶습니다 check[0] = test.inst[i].lane_0.PIN_FIRST;과 같은 라인은 마음에 들지 않습니다. 이는 테스트 목적으로 사용되는 것으로, 합성 할 수있는 것은 아닙니다.

왜 이것이 허용되지 않는 이유를 설명하고 다른 해결책을 제안 할 수 있습니까? 그것은 모든 루프 반복마다 작업을 작성해야 할 필요가있는 것처럼 보이며 불필요하게 부풀어 오르고 추한 것처럼 보입니다.

감사

답변

0

내 자신의 질문에 대답하기 위해, 대답은 Verilog를 함께 할 수있는 방법이 없다는 것입니다. Verilog는 기능 측면에서 보면 엄청나게 벙어리이며, 태스크를 사용하면 모듈 인스턴스에 대한 상수 인덱스 만 지원할 수 있습니다. 반복 할 수 없습니다.

+0

나는 Verilog에서 너무 가혹하다고 생각합니다! 시뮬레이터의 버전은 무엇입니까? Verilog 2001은 루프 생성을 지원합니다. 그런 루프를 사용하여 코드 작성을 시도 했습니까? http://www.sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf – Ari

+1

나는 2001 년을 활성화했다. 문제는 루프를 생성하지 않습니다 (실제 디자인을위한 루프를 생성했습니다). 위에서 내가 원했던 것은 우회 로직에 대한 테스트 였기 때문에 왜 (기존의) 계층 구조를 파헤쳐야하는지. 이 테스트 컨텍스트에서 문을 생성하는 것은 유효하지 않습니다. 기존 다중 모듈 인스턴스의 값을 루프하는 방법이 필요합니다. 불행히도 Verilog에서는 이러한 유형의 루핑을 허용하지 않습니다. 모든 인덱스를 명시 적으로 지정해야하므로 모든 루프를 손으로 풀어야합니다. – user3570982

관련 문제