2017-12-29 2 views
-1
module hh (input [2:0] a [0:3], output b); 

wire [2:0] c1 [4:1]; 
wire [0:2] c2 [0:3]; 
wire d; 

u_hh_1 hh (.a(c1   ), .b(d)); // it is right; 
u_hh_2 hh (.a(c1[4:1][2:0]), .b(d)); // illegal slice name; 
u_hh_3 hh (.a(c2   ), .b(d)); // it is right, 
             // and in the netlist, 
             // the bits of c2 is swapped to a; 
u_hh_4 hh (.a(c2[0:3][2:0]), .b(d)); // illegal slice name; 

은 VERILOG하지 SystemVerilog에지지된다. 이를 더 읽기 쉽게하기 위해 범위를 명시 적으로 표시하고 싶지만 불법입니다. 함수에서도 같은 문제가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?SystemVerilog를 이용 어레이/기능

답변

1

SystemVerilog 구문을 사용하면 두 개 이상의 범위를 지정할 수 없으며 범위는 선택한 가장 오른쪽 치수 여야합니다.

명시하려는 경우 typedef을 만들고 캐스트를 사용하십시오. typedef를 사용하는 것은 코드에 임의의 숫자가 흩어져있는 대신에 더 나은 프로그래밍 방법입니다.

typedef logic [2:0] blue_port_t[4:1]; 
typedef logic [0:2] green_port_t[0:3]; 

module hh (input green_port_t a, output wire b); 

wire blue_port_t c1; 
wire green_port_t c2; 
wire d; 

u_hh_1 hh (.a(c1   ), .b(d)); // 
u_hh_2 hh (.a(blue_port_t'(c1)), .b(d)); // 
u_hh_3 hh (.a(c2   ), .b(d)); // it is right, 
             // and in the netlist, 
             // the bits of c2 is swapped to a; 
u_hh_4 hh (.a(green_port_t'(c2)), .b(d)); 

캐스트는 사용중인 문서 유형 이외의 다른 작업을 수행하지 않습니다.

0

Verilog에서는 벡터가 MS에서 LS로 끝나는 것이 바람직합니다. 0으로 끝나는 것이 좋습니다. 다른 Verilog 코더가 그것을 쉽게 읽을 수 있도록하는 규칙입니다.
동일한 규칙 : 추억은 정반대의 방식으로 진행됩니다. LS부터 MS까지 0부터 시작하십시오. (하지만이 경우가 아닌 많은 코드를 보았습니다. 일부 시뮬레이터에서는 그렇게 할 경우 경고를 표시합니다).

wire [2:0] c1 [0:3]; 
wire [2:0] c2 [0:3]; 

당신은 당신의 코드가 합성-수있는 두 개의 차원 슬라이스를 사용할 수 있도록하려면하지만 지수는 비트 슬라이스는 선택 사항입니다 [비트 슬라이스] [memory_address]입니다. 생략 된 경우 전체 항목을 가져옵니다. 따라서 당신은 할 수 있습니다 :

c1[1][1:0] // LS 2 bits of second entry of memory c1 
c1[0]  // First memory entry of c1 which is 3 bits wide 

을 당신은 할 수 없다 :이 표준을 지원하지 않습니다 동시에 메모리의 처음 두 항목을 선택하는 것처럼 논리적

c1[1:0] 

하드웨어.