몇 비트?'|몇 진수?|해당 수
참고
표시x -> 자동적으로 32'd해당수(32비트+10진수+해당수)
0,1,x(미지수-알수없음),z(끊겨있음-플로팅상태)
wire <이름>;
wire <이름> = 값;
reg <이름>;
integer <이름>;
(32비트 reg)
참고
묶음(vector)
wire
와 reg
의 묶음: <reg또는 wire> [0:7] <이름>
*ex) reg [0:10] = busA;
쪼개기
wire의 묶음을 쪼개는것 또한 가능하다.
*ex) wire [0:30] = busA
byte1= busA[0:5]
게이트를 사용하여 모듈을 모델링하는 것
black box의 안을 정의하는 것
module <module_name>(<input port/ output port>);
input/output port선언 (wire와 같은 느낌)
reg 선언
wire 선언
parameter 선언
// 구성요소 선언
always, initial
function, task 정의
assign
function, task 호출
// 구성요소 연결
endmodule
*ex) a,b를 입력받아서 sum, cout을 내보내는 adder
module half_add(a,b,sum,cout)
input a, b;
output sum. cout;
wire cout_bar;
xor(sum, a, b);
nand(cout_bar, a, b);
not(cout, cout_bar);
endmodule
즉, 순서는 상관없음(프로그래밍 언어가 아니다.) 소자들끼리의 연결만 잘 되면 된다.
모듈의 사용
만들어진 모듈/함수를 사용하는 것
xor(sum, a, b) //함수(출력,입력)
and(cout, a, b, c) // 기본함수의 출력은 1개임
nand(cout, a, b)
.해당포트(넣을 값)
)fulladder(.c_out(a), .sum(b))
게이트 대신에 연산자
와 할당
을 사용하는 것
연산자
할당
assign
출력
= 입력 + 연산자
ex) assign out = i1 & i2;
*참고
wire i1, i2, out; assign out = i1 & i2;
real a,b,c; c = a - b
;*if()
~;
else
~;
case()
~;
case()
~;
endcase
항상 수행되어야 하는 하드웨어의 동작을 묘사한 것.
always @(in1, in2, a, b) begin
if (in1 ==0)
out = a;
else
out = b;
always
~ begin
~ end
프로그래밍 언어에서의 중괄호({})는 begin end로 표현한다.
@(~)
항상 체크하는데 괄호안의(~)의 값이 바뀔 경우만 체크하도록 하자는 뜻
(모든 입력은 *로 표현)
보조함수들: 시뮬레이션할 때 결과에서 참고할 수 있도록 도와주는 함수들
$display();
-> C의 printf문법이랑 비슷
$time
모듈들을 테스트 시뮬레이션해보는 것
input/output port존재 X
(wire로 표현하자)
stimulus를 넣고 response를 관찰
initial 구문: testbench에서만 사용하는 것으로 한번만 실행되고 주로 stimulus를 넣어줄 때 사용
ex)
module test_Fix();
reg A, B, C;
circuit c1(A, B, C, Out);
initial begin
A=0; B=1; C=0;
#50 A=1;
#50 A=0; C=1;
#50 C=0;
#50 $finish;