전체 글
-
AMBA3 APB protocol 2개발/Protocol 2022. 2. 3. 23:09
PSLVERR 신호는 옵션이다. 반드시 있을 필요는 없다. PSLVERR는 APB 트랜잭션에서 마지막 사이클에서만 값이 유효하다고 간주한다. (PSEL / PENABLE / PREADY 모두 1으로 유지되고 있을 때) 그 이전의 사이클에서는 아무 값을 가져도 의미가 없다. 트랜잭션에서 에러가 발생해도 slave에서는 상태가 바뀔수도 있고 안바뀔수도 있다. 이는 설계하기 나름이다. 쓰기 트랜잭션에서 에러가 발생해도 slave의 레지스터가 업데이트 되지 않았다고는 보장할수 없다. 읽기에서 에러가 발생한다면 slave에서 PRDATA 신호를 0으로 set할 필요는 없다. 쓰기 트랜잭션에서 마지막 사이클에서 PSLVERR가 set 되었다. 마찬가지 읽기 트랜잭션에서 마지막 사이클에서 PSLVERR가 set 되었..
-
AMBA3 APB protocol 1개발/Protocol 2022. 2. 3. 22:53
AMBA™ 3 APB Protocol v1.0 Specification 기준으로 정리함 APB 프로토콜은 ARM에서 발표한 AMBA3 프로토콜 스펙 중 하나다. APB는 높은 성능이 필요하지 않은 주변장치를 연결하는데 쓰인다. 저성능, 저전력의 프로토콜이다. 모든 신호는 clock 상승엣지에서 동작하며 하나의 트랜잭션에 적어도 2사이클이 소모된다. 아래에 APB의 신호들이 정리되어있다. APB의 모든 신호들은 P로 시작한다. PCLK은 APB master / slave 에 적용되는 공통 클락이다. 다른 신호들은 PCLK 상승엣지에 맞춰서 동작한다. PRESETn 은 APB master / slave asynchronous 리셋신호다. PADDR 는 slave의 주소를 나타낸다. PSELx 는 APB ma..
-
[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..