💻 assign and deassign
procedural continuous assignment는 net에 값을 할당하는 구문을 말한다.
wire assign a=b+c; 이런구문이 예시이다.
레지스터 값을 잠시 오버라이드 해서 쓰고 싶다면 assign을 사용하면 된다.
그리고, deassign을 쓰면 원래값으로 다시 되돌아온다.
이것은 reg타입에만 쓸 수 있다.
💻 force and release
위의 말했던 assign and deassign과 비슷한 효과를 낸다.
하지만 reg와 net 타입 둘다 오버라이드 하는데 사용될 수 있으므로 좀 더 많이쓰이고, stimulus에서 특히 사용이 많이 되어진다. 디자인 블록 안에 이것들을 사용하는 것은 추천되어지는 방법은 아니다.
예시를 보자.
force를 줘서 dff.q라는 레지의 값을 1'b1 로 바꿔준다.
그리고 release하면 #50의 딜레이 후에 다시 원래 값으로 돌아간다.
이번에는 net타입에서 사용되는 것이다.
out은 a&b&c로 할당이 되어져 있다.
그러나 force를 줘서 a|b&c로 잠시 바꿔준다. 그리고 release를 사용하여 다시 원래의 값으로 돌아가게 한다.
💻 defparam statement
parameter로 지정된 값도 다른 모듈에서 바꿔서 사용할 수 있다.
이 예시에서는 hello_world라는 모듈에서는 id_num이라는 parameter는 0으로 지정되어 있다.
하지만 top 모듈에 와서는 defparam을 사용하여서 id_num을 계속해서 바꿔주며 출력해주고 있다.
이렇게 simulate module에서 많이 사용되는거 같다.
💻 Module_Instance Parameter Values
defparam으로 파라미터 값을 바꾸는것을 알아보았다.
그러나 defparam 없이 값을 바꿀 수 있다.
모듈을 인스턴스화 할때 입력인자로 파라미터의 값을 지정해주면 된다.
module bus_master;
parameter delay1 = 2;
parameter delay2 = 3;
parameter dealy3 = 7;
endmodule
module top;
bus_master #(4,5,6)b1(); //b1: delay1 = 4, delay2 = 5, delay3 = 6
bus_master #(9,4)b2(): //b2: delay1 = 9, delay2 = 4, delay3 = (default)
bus_master#(.delay2(4), delay3(7)) b3();
endmodule
bus_master라는 모듈을 만들고 그안에 delay 1,2,3이라는 파라미터를 만들어서 각각 값을 넣어주었다.
top모듈안에서 bus_master 모듈을 인스턴스화 해주는데 #(4,5,6)처럼 인자로 넣어줘서 파라미터의 값들을 지정해줄 수 있다. 이들은 순서대로 값을 집어 넣어줘야하면 b3처럼 직접 원하는 것들만 바꿔줄 수도 있다.
💻 Time Scale
assign #5 a=b+c라는 구문을 보자.
여기서 #5는 딜레이를 주는것이다. 여기서 #5는 5초인것이 아니다. 단위가 따로 있다. 이것이 Time Scale이다.
맨 앞에 `timescale 100ns / 1ns라는 Time Scale을 준다.
여기서, 100ns는 단위, 1ns는 정밀도를 의미한다.
이렇게 정의 되어 있는 곳에서 #5라는 delay를 주면 이것은 5 * 100ns = 500ns 만큼의 딜레이가 주어진다.
정밀도는 무슨말일까?
위 구문에서 정밀도는 10ns로 지정되어있다.
#1.1은 1100ns이고, #1.11은 1110ns이다. 그런데 #1.111은 1111ns 인데, 1110ns로 구분되어진다.
이는 정밀도가 10ns라서 최소단위가 10ns라서 그 이하의 시간들은 0으로 표시되어 지기 때문이다.
이는 매우 중요하기 때문에, 꼭 알고 가야된다.
💻 File Output
$fopen을 이용하여서 파일을 열 수 있다.
32비트 값을 반환한다.
f가 붙은 $fdisplay, $fmonitor, $fwrite, $fstrobe를 이용해서 파일 전용기능들을 사용할 수 있다.
💻 Displaying Hierarchy & Strobing
$display("Displaying in %m");
%m을 입력하면 현재 모듈이 갖는 hierarchy를 출력할 수 있다.
always @(posedge clock)
begin
a=b;
c=d;
end
always @(posedge clock)
$strobe(........);
$strobe는 $display와 유사히 출력하는 일을 한다. 하지만, 가장 마지막에 수행한다
#0 delay를 준거랑 유사하다고 생각하면 된다.
위, a=b; c=d; 구문을 진행하고, 마지막에 $strobe를 해준다.
💻 $random
$random은 난수를 생성하는데 쓰이는 System task이다.
위 블루박스에서 addr이라는 32비트 reg에 랜덤수를 생성해 주었다. r_seed는 시드로서, 2라고 정의해두었다고 생각한다.
rand1 = $random % 60; 처럼 범위를 지정해서 난수 생성이 가능하다.
'2-2 > 디지털 설계 및 실험' 카테고리의 다른 글
[디지털 설계 및 실험] Verilog vol10. Timing and Delays (0) | 2022.12.03 |
---|---|
[디지털 설계 및 실험] 8. tasks and functions (0) | 2022.11.17 |
[디지털 설계 및 실험] Verilog 기본 vol 6. dataflow modeling (2) | 2022.10.21 |
[디지털 설계 및 실험] Verilog 외전 (1) | 2022.10.15 |
[디지털 설계 및 실험] Verilog 기본 vol.5 Gate-Level Modeling (0) | 2022.10.12 |