Verilog
-
[SystemVerilog] packed / unpacked array개발/SystemVerilog 2022. 1. 15. 23:43
베릴로그 / 시스템베릴로그에서 배열을 선언할 때 2가지 방법이 있다. 1. unpacked array int a [2:0][0:1]; int b [1:3][2:1]; 변수 이름 오른쪽으로 배열을 지정하면 unpacked array가 된다. 인덱싱 순서는 왼쪽에서 오른쪽으로 순회한다. module test(); int a [3:1][0:4]; initial begin a[1] = '{default : 1}; a[2] = '{default : 2}; a[3] = '{default : 3}; foreach (a[i, j]) $display("a[%d][%d] = %d", i, j, a[i][j]); end endmodule 2. packed array 변수 이름 왼쪽에 배열을 지정하면 packed array ..
-
[SystemVerilog] 시스템베릴로그 개요개발/SystemVerilog 2022. 1. 10. 21:06
시스템베릴로그는 기존의 베릴로그를 확장하여 설계, 스펙, 검증을 통합된 언어로 할 수 있게 해준다. 기존 verilog 2001 문법에 비해서 추가된 것들이 상당히 많다. 거의 다른 언어라고 봐도 무방할 정도 (하지만 베릴로그 문법과 호환된다.) 시스템베릴로그에서 도입된 것들을 나열하면 다음과 같다. 데이터타입 추가 연산자 추가 스케쥴링 추가 task / function 문법 강화 객체지향 프로그래밍 contriant randomization 인터페이스 프로세스 통신 coverage assertion DPI ... 이외에도 더 많이 있다. 특히 검증과 관련해서 기능이 많이 강화되었다. 객체지향과 contraint random기능은 설계를 검증하기 위해 테스트벤치를 짤 때 매우 유용한 기법이다. 다음 글에..
-
[Verilog][기초문법] task, function개발/Verilog 2022. 1. 9. 02:24
함수와 태스크를 이용해 반복적인 루틴작업을 모듈화 할 수 있다. 두개의 차이점을 표로 나타내면 다음과 같다 function task function ... endfunction 시뮬레이션 시간이 0이다. 딜레이, 타이밍 제어 등의 구문들은 사용할 수 없다. 하나의 값을 리턴한다 내부에서 function은 호출되지만, task는 호출할 수 없다. task ... endtask 시뮬레이션 시간은 0 될 수 있다. 딜레이, 타이밍 요소가 포함될 수 있다. 리턴값은 없지만, 여러개의 output 포트로 출력을 보낼 수 있다. 내부에 다른 task, function을 호출할 수 있다. 둘의 가장 큰 차이점은 바로 타이밍제어 요소가 포함되는지 여부이다. function은 @(), #(delay) 등의 문장을 넣을 ..
-
[Verilog][기초문법] generation 구문 사용법개발/Verilog 2022. 1. 8. 23:21
반복적 블록 생성을 위한 generation 사용법 generate - endgenerate 블록 안에 있는 모듈을 반복적으로 생성하게 만들어준다. 똑같은 설계요소를 반복적으로 생성해야 할 때 유용하다. 블록 안에 들어올 수 있는것은 다음과 같다. 1. 모듈 2. 프리머티브 3. UDP 4. continuous assign 5. initial , always 블록 또한 generate 블록 안에서 wire, reg, integer, time, event 등의 변수 선언도 가능하다. 다음 예제를 통해 generate 구문 사용법을 알아본다. 4bit ripple carry adder 설계 예제이다. module adder #(parameter N = 4) ( output [N-1:0] sum, output..
-
[Verilog][기초문법] 조건문, 분기문개발/Verilog 2022. 1. 8. 22:28
C 언어 처럼 if, case 구문 쓸 수 있다 다만 베릴로그에서 데이터는 x, z 값이 있기때문에 조건문을 작성할때 이것을 유의해야한다. 기본적으로 1 이 아닌 값은 모두 false로 판단한다. module tb(); reg a; initial begin a = 1'bx; $display("a is %b",a); if (a) $display("x is true"); else $display("a is false"); a = 1'bz; $display("a is %b",a); if (a) $display("z is true"); else $display("z is false"); end endmodule 위 코드를 실행하면 아래의 결과가 나온다. if 문을 쓰기에는 분기가 너무 많으면 case 구문을 쓴..
-
[Verilog][기초문법] 타이밍 제어카테고리 없음 2022. 1. 6. 21:32
3가지의 타이밍 제어방법이 있다 1 딜레이에 기반한 제어 2 event를 이용한 제어 3 level sensitive 제어 1. 딜레이 기반의 타이밍 제어는 다시 3가지가 있다 - 정규할당 지연 또는 관성지연 (regular delay control) 'timescale 1ns/1ps reg a, b; // 정규지연 initial begin a = 0; b = 1; #10 a = 1;// 10ns 후에 할당 #(a+b) a = b; // 2ns 후에 할당 #(1:3:5) a = 1; // min : typ : max end 명시된 딜레이 후에 a 값에 할당이 된다. 딜레이는 숫자, 변수 모두 사용이 가능하다. 프리머티브와 마찬가지로 min : typical : max 형식도 지원된다. 정규지연은 딜레이가..
-
[Verilog][기초문법] 게이트 딜레이카테고리 없음 2022. 1. 5. 22:24
베릴로그의 프리머티브 게이트들은 파라미터 설정을 통해서 3가지의 딜레이를 모델링 할 수 있다 3가지는 각각 상승, 하강, 턴오프 딜레이 값이다. y 상승 딜레이는 0, x, z 값에서 1로 변할때 걸리는 시간, 하강 딜레이는 1, x, z 값에서 0로 변할때 걸리는 시간, 턴오프 딜레이는 0, 1, x 값에서 z로 변할때 걸리는 시간이다. #(상승, 하강, 턴오프) name(out, in1, in2, ... ); 형식으로 선언할 수 있다. // #() 안에 수를 적어서 딜레이를 설정함 // 하나만 적으면 상승 하강 턴오프 모두 같은 값이다. and #(10) a1(*); // 두개를 적으면 각각 상승 하강 딜레이다. 턴오프 딜레이는 상승, 하강값 중 작은 값이다 and #(10, 15) a2(*); //..
-
[Verilog][기초문법] 인스턴스 배열카테고리 없음 2022. 1. 5. 22:02
인스턴스 배열은 반복적으로 모듈을 인스턴스화 할 때 유용한 문법이다 wire [3:0] a, b, c; // and 게이트 인스턴스 배열 and and_gate [3:0] (a, b, c); // 위는 아래와 같이 풀어쓸 수 있다 and and_gate0 (a[0], b[0], c[0]); and and_gate1 (a[1], b[1], c[1]); and and_gate2 (a[2], b[2], c[2]); and and_gate3 (a[3], b[3], c[3]); 4개의 and 게이트를 인스턴스했다. (a = b&c) 인스턴스 배열을 선언할 땐 신호들끼리 벡터의 길이가 같아야한다.