기본적인 System verilog 문법을 공부한 뒤, 이해 안가는 것들이 있었는데
바로 modport와 clocking이다.
두 개의 문법은 어느곳에서 이해가 가도록 설명이 안되어있어서
공부 후에 이해가 가도록 정리해보았다..
MODPORT?
modport란 interface내에서
중복된 port들을 사용하는게
번거로울때 선언한다.
복잡한 코드를 단순하게 만들어주는 역할!
예를 들어,
axi protocol을 사용할때
axi bus에 필요한 signal들(id, data, addr 등..)
을 interface로 선언한다.
interface를 통하여
input과 output signal을 표현할 수는 있다.
하지만,
interface signal을 input과 output을 바꿔서
선언하고싶으면 어캄?
ex
AXI protocol에서는
데이터를 요청하는 master,
데이터를 주는 slave가 필요하다.
이럴때
Name | Input signal | Output signal |
Master | b_id, b_resp, b_user, b_valid aw_ready w_ready ar_ready r_id, r_data, r_resp, r_last, r_user, r_valid |
aw_id, aw_addr, aw_len, aw_size, aw_burst, aw_lock, aw_cache, aw_prot, aw_qos, aw_region, aw_stop, aw_user, aw_valid w_data, w_strb, w_last, w_user, w_valid ar_id, ar_addr, ar_len, ar_size, ar_burst, ar_lock, ar_cache, ar_prot, ar_qos, ar_region, qr_user, ar_valid r_ready |
Slave | aw_id, aw_addr, aw_len, aw_size, aw_burst, aw_lock, aw_cache, aw_prot, aw_qos, aw_region, aw_stop, aw_user, aw_valid w_data, w_strb, w_last, w_user, w_valid ar_id, ar_addr, ar_len, ar_size, ar_burst, ar_lock, ar_cache, ar_prot, ar_qos, ar_region, qr_user, ar_valid r_ready |
b_id, b_resp, b_user, b_valid aw_ready w_ready ar_ready r_id, r_data, r_resp, r_last, r_user, r_valid |
master와 slave는 input port와 output port가 딱 반대이다.
이럴때 인터페이스를 두개 선언하면
가성비 떨어진다. ( 또 선언해야자나요..)
따라서 이럴때 modport를 선언한다.
interface AXI_BUS;
logic aw_id;
logic aw_addr ;
.
.
.
//port 선언
modport Master(
output aw_id, aw_addr ...
input w_ready;
);
modport Slave(
output w_ready;
input aw_id, aw_addr ...
);
endinterface
이런식으로 interface signal 나열 후
interface내에서 Master랑 slave 적으면 됨
그래서 선언을 어디서 하냐
design 내에서 한다.
정확히는 design의 integration시에 한다.
AXI_BUS() IP();
이렇게 선언하기만 하면 된다.
AXI에서 addr나 data, id, user의 width가
쓰이는 용도에 따라 다르니 위 interface에서
parameter를 정의하여 쓰일때마다
custom으로 바꾸기도 한다.
그냥 inout port 선언하면 되잖슴?
위 생각을 가지고 있는 1인으로
한 번 찾아보았다.
사실 그래도 된다.
하지만
테스트 벤치와 디자인이 모두 동일한
인터페이스를 사용 시
in, out port에 다른 값을 주게되면
X(unknown) 값이 나오게 된다.
따라서 modport를 사용하는 것을
권장하고 있다.
CLOCKING
interface에서 특정 clock에
동기화되어 signal을 캡쳐하려고 만든 기능
design이 아닌 testbench에서
signal을 delay나 sync를 맞추어
확인하고 싶을때 쓴다.
결국 중요한 신호들의 타이밍 정보를 보는
monitor용이라고 볼 수 있다.
module Test;
reg clk;
reg data;
clocking cb @(posedge clk);
default input #1 output #1;
input data;
endclocking
cb cb_inst @(posedge clk);
always_ff @(posedge clk)begin
cb_inst.data <= data;
end
예시를 보면
cb라는 clocking block을 선언했고
clk 신호가 positive edge일때 토글됨을 알 수 있다.
그리고 input output signal 에 1만큼 delay를 주었다.
Clocking event
@(posedge clk)
내가 sync를 맞추고자 하는 신호를
여기다 쓰면된다.
Clocking Skew
default input #2 output #5;
clock skew라고
딜레이를 주고 싶을때 넣는다.
즉 input은 2 시간 후,
output은 5 시간 후에
sampling을 하겠다고 생각하면 됨.
시간은 timescale에 따라 정해짐.
'SoC > System Verilog' 카테고리의 다른 글
[Verilog] initial begin 은 언제쓰일까? (0) | 2023.03.24 |
---|---|
Module과 Instance의 차이점 (0) | 2023.03.24 |