특정 계층 구조를 탐구해야하는 작업을 작성하려고합니다. 특정 인스턴스의 다른 핀을 간결하게 비교할 수 있습니다. (가 아닌 상수 레지스터를 할당 받아 들일 것을 주장상수 표현을위한 피연산자가 올바르지 않습니다.
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;
과 같은 라인은 마음에 들지 않습니다. 이는 테스트 목적으로 사용되는 것으로, 합성 할 수있는 것은 아닙니다.
왜 이것이 허용되지 않는 이유를 설명하고 다른 해결책을 제안 할 수 있습니까? 그것은 모든 루프 반복마다 작업을 작성해야 할 필요가있는 것처럼 보이며 불필요하게 부풀어 오르고 추한 것처럼 보입니다.
감사
나는 Verilog에서 너무 가혹하다고 생각합니다! 시뮬레이터의 버전은 무엇입니까? Verilog 2001은 루프 생성을 지원합니다. 그런 루프를 사용하여 코드 작성을 시도 했습니까? http://www.sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf – Ari
나는 2001 년을 활성화했다. 문제는 루프를 생성하지 않습니다 (실제 디자인을위한 루프를 생성했습니다). 위에서 내가 원했던 것은 우회 로직에 대한 테스트 였기 때문에 왜 (기존의) 계층 구조를 파헤쳐야하는지. 이 테스트 컨텍스트에서 문을 생성하는 것은 유효하지 않습니다. 기존 다중 모듈 인스턴스의 값을 루프하는 방법이 필요합니다. 불행히도 Verilog에서는 이러한 유형의 루핑을 허용하지 않습니다. 모든 인덱스를 명시 적으로 지정해야하므로 모든 루프를 손으로 풀어야합니다. – user3570982