HDL
-
[SystemVerilog] 랜덤변수 3개발/SystemVerilog 2022. 1. 27. 01:09
제약조건이 너무 복잡한 경우가 있다. 이럴땐 함수를 정의하여 제약조건을 적용할 수 있다. class packet; rand bit [3:0] start_addr; rand bit [3:0] end_addr; constraint start_addr_c {start_addr == s_addr(end_addr);}; function bit [3:0] s_addr (bit [3:0] e_addr); if (e_addr < 4) s_addr = 0; else s_addr = e_addr - 4; endfunction endclass module tb; initial begin packet pkt = new(); repeat (10) begin pkt.randomize(); $display("start = %d, ..
-
[SystemVerilog] 랜덤변수 2개발/SystemVerilog 2022. 1. 26. 23:30
dist 키워드로 constraint 내부에서 확률 가중치를 부여할 수 있다. 가중치는 := 또는 :/ 으로 부여한다. class myclass; rand bit [2:0] typ; constraint c1 {typ dist {0:=20, [1:5]:=50, 6:=40, 7:=10};}; endclass class myclass; rand bit [2:0] typ; constraint c2 {typ dist {0:=20, [1:5]:/50, 6:=40, 7:=10};}; endclass :=은 범위에 속하는 수들이 동일한 가중치를 부여한다. 위 예에서 [1:5]:=50 에서 5개의 수는 각각 50의 가중치를 갖는다. :/ 는 지정한 가중치를 범위에 속하는 수들이 균등하게 나눠갖는다. [1:5]:/50 에..
-
[SystemVerilog] 랜덤변수 1개발/SystemVerilog 2022. 1. 25. 22:16
시스템베릴로그의 강력한 기능인 constriant randomize 를 알아본다. 베릴로그에는 랜덤값을 생성하는 시스템태스크가 있다. 하지만 어떤 제약조건에 맞는 범위의 랜덤변수를 생성하려면 번거롭게 코딩을 해야한다. 시스템베릴로그는 랜덤변수에 제약조건과 확률분포, 조건부 확률을 지원하여 사용자의 입맛대로 자유롭게 랜덤변수를 생성 할 수 있다. 시뮬레이터는 트루랜덤이 아니라 pseudo 랜덤값을 생성하는데 이는 테스트의 일관성과 반복적 디버깅을 위해서 그런것이다. 시드가 같으면 랜덤값의 시퀀스도 같다. 랜덤변수를 선언할 때 rand / randc 키워드를 붙이면 된다. rand 는 균일한 확률분포를 갖는 랜덤변수를 정의한다. randc는 랜덤값이 순환하는 하도록 정의한다. 랜덤값을 주려면 randomiz..
-
[SystemVerilog] 클래스 4 데이터 은닉개발/SystemVerilog 2022. 1. 24. 17:23
데이터를 은닉하여 클래스 외부에서 접근할 수 없도록 만들 수 있다. local , protected 키워드를 사용한다. class frame; local logic [4:0] addr; local logic [7:0] payload; protected bit parity; ... endclass local 으로 정의하면 해당 클래스의 멤버들만 그 변수를 참조할 수 있다. protected 으로 정의된 변수는 는 하위 클래스의 멤버들도 참조할 수 있다.
-
[SystemVerilog] 클래스 3 다형성2개발/SystemVerilog 2022. 1. 24. 16:36
다형성을 활용하기 위해 virtual method를 알아본다. 이전 글에서 정의한 클래스를 그대로 갖고왔다. 다만 packet 클래스 내부에 display() 태스크 앞에 virtual 키워드가 붙었다. virtual method를 정의하기 위해선 virtual 키워드를 function / task 앞에 쓰면 된다. class packet; bit [31:0] addr; function new (bit [31:0] addr); this.addr = addr; endfunction virtual task display(); $display("[base] addr = 0x%0h", addr); endtask endclass class extpacket extends packet; bit [31:0] data..
-
[SystemVerilog] 클래스 3 다형성개발/SystemVerilog 2022. 1. 24. 13:07
객체지향에서 다형성이란 베이스클래스에서 하위 클래스의 속성과 메서드를 직접 사용 할 수 있는것을 의미한다. 아래와 같은 클래스가 정의되어있다. class packet; bit [31:0] addr; function new (bit [31:0] addr); this.addr = addr; endfunction task display(); $display("[base] addr = 0x%0h", addr); endtask endclass class extpacket extends packet; bit [31:0] data; function new (bit [31:0] addr, data); super.new(addr); this.data = data; endfunction task display(); $di..
-
[SystemVerilog] 클래스 3 상속개발/SystemVerilog 2022. 1. 24. 00:11
객체지향의 가장 기본적인 상속 시스템베리로그에서 클래스 상속은 extends 키워드를 사용한다. 하나의 클래스만 상속 가능하다. class frame; logic [4:0] addr; logic [7:0] payload; bit parity; function new (input int addr, payload); this.addr = addr; this.payload = payload; parity = ^{addr, payload}; endfunction endclass // extended class class tagclass extends frame; static int framecount = 0; int tag; function new(); tag = ++framecount; endfunction ..
-
[SystemVerilog] 클래스 2카테고리 없음 2022. 1. 23. 22:38
클래스 내부에 static 변수를 선언할 수 있다. static 변수는 같은 클래스끼리 공유되는 변수이다. class frame; static int framecount = 0; int tag; logic [4:0] addr; logic [7:0] payload; bit parity; function new(input int address, data); payload = data; addr = address; parity = ^{addr, payload}; tag = ++framcount; endfunction endclass frame 클래스를 인스턴스 할 때 마다 framecount 값이 증가하고, tag에는 몇 번째 오브젝트인지 저장된다. 메서드또한 static으로 선언할 수 있다. static 메..