SoC 설계 14

배열 시스템 함수들

Array system functions SystemVerilog는 배열의 크기를 직접 선언하지 않은 채, 배열을 쉽게 조작할 수 있는 여러 특수한 시스템 함수들을 제공합니다. 합성 가능한 배열 쿼리 함수들에는 $left(), $right(), $low(), $high(), $increment(), $size(), $dimensions(), 및 $unpacked_dimensions() 이 있습니다. 다음은 이러한 함수 중 일부를 사용하는 예입니다: typedef logic [31:0] d_array_t [0:4][0:4]; function d_array_t filter ( input d_array_t d ); for (int i = $low(d,1); i

SystemVerilog: Procedural blocks

SystemVerilog는 기존의 Verilog에 아주 많은 프로그래밍 능력을 추가했다. 이러한 향상을 의도한 목적은 다음 3가지로 볼 수 있다. 코드 간결화 설계시 기능적 결함 줄이기 시뮬레이션과 합성이 동일하게 동작하도록 만들기 Procedural blocks 기존의 Verilog에서는 always문을 사용하여, combinational, latch 와 sequential logic을 생성하였다. 여기서 문제는 합성 툴과 시뮬레이션 툴이 설계자의 어떤 종류의 logic을 표현할려고 헀는지 알 방법이 없다는 것이었다. 이러한 툴들은 procedural block안에 있는 코드를 해석할 수 있었고, 설계자의 의도를 nice한 방식으로 추측하는 것 뿐이었다. combinational logic에서 간단한 ..

SystemVerilog: Casting

SystemVerilog는 Verilog에 cast 연산자를 추가했다: ’() cast 연산자는 3가지 type이 있고, 모두 synthesizable하다. Type casing: sum = int’(r * 3.141592); Size casting: sum = 16’( a+ 5); Sign casting: sum = signed’(a) + signed’(b); casting의 한가지 좋은 사용예로 lint checker에서 size mismatch warning message를 제거할 수 있다. 다음은 a를 b만큼 right rotate하는 합성 가능한 코드이다. logic [31:0] a, y; logic [5:0] b; always_comb y = {a,a} >> b; // rotate a by b..

SystemVerilog: Parameterized task/functions

파라미터 형 모듈은 Verilog에서 매우 강력하고 많이 사용된다. 파라미터들은 각 모듈의 인스턴스를 생성할때 다시 설정할 수 있어서, 그 모듈을 configurable하고, reusable하게 만든다. 기본적인 Verilog는 argument의 size와 type은 parameterized할 수 없어서, configurable하고 reusable하게 작성하는데 제한이 있었다. SystemVerilog는 이런 제약을 해결하는 방법을 제공한다. 그 방법은 parameterized class안에 static tasks나 functions을 사용하는 것이다. task나 function이 호출될때마다, 그 class parameters가 redefine된다. virtual class Functions #(par..

SystemVerilog: Arrays

SystemVerilog는 다양한 유형의 array를 제공하여, 복잡한 데이터 구조를 구축하는데 많은 유연성을 제공한다. Static arrays Dynamic arrays Associative arrays Queues 1. Static Arrays 정정 배열은 컴파일하기 전에 크기가 알려진 배열이다. 아래 예제에서는 8 bit 정적 배열이 선언되고 일부 값이 할당되고 반복되면서 해당값을 출력한다. // (a) module tb; bit [7:0] m_data; initial begin m_data = 8'h5a; for(int i=0; i

SystemVerilog: modport

direction을 가진 modport는 interface 내에서 정의된다. 이들은 한 module 내에서 interface를 접근할 때, 특정한 제한이 있다는 것을 내포한다. modport로 정의하면, 해당 모듈내에서 direction이 정의된 것으로 보면 된다. verilog에서 사용하는 input, output, inout들은 하나의 bundle로 묶은 것으로 생각하면 된다. 문법 modport [identifier] ) input [port_list], output [port_list] ); 아래 예제는 4 개의 logic들과, 2개의 modport 선언을 포함하는 인터페이스인 myInterface를 보여준다. (a9-11) modport인 dut0는 ack, sel을 입력으로, gnt, irq0..