Kim Seon Deok
[Verilog] Combinational Logic Modeling 본문
조합회로는 현재 들어오는 입력에 의해 출력이 결정된다.
조합논리회로의 형태 | logic gate(and,or,not,nand,,,) multiplexer encoder decoder random logic |
adder subtractor ALU Lookup table Comparator |
조합회로설계에 이용되는 verilog 구문 | gate primitive concurrent assignment behavioral modeling 함수 및 task (시간 제어 못 가짐) module instance |
|
논립합성이 불가능한 verilog 구문 (simulation용 테스트 벤치에만 사용된다.) |
initial문 스위치 프리미티브(cmos, nmos, tran) forever문 wait, event, 지연 등 타이밍 제어 구문 force-release, fork-join 시스템 task($finish, $time, $display 등) |
조합논리회로 모델링
- always구문
감지신호 목록에 회로의 입력신호들이 모두 빠지지 않고 포함되어야 한다. 하나라도 누락된다면,always 구문 안으로 들어가서 값을 결정할 수 없기 때문에, 합성 전과 후의 시뮬레이션 결과가 다를 수 있다.
- if 조건문과 case 문
모든 입력 조건들에 대한 출력값이 명식적으로 지정되어야 한다.
조건이 없다면 래치가 생성되어 순차논리회로가 될 수 있다.
- 논리 최적화가 용이한 구조와 표현을 사용
최소의 게이트 수와 최소 지연경로를 갖는 회로가 합성되도록 해야 한다.
- 소스코드가 간결해지도록 모델링
일정한 들여쓰기를 하면 소스코드의 가독성을 좋게 하여 오류 발생 가능성을 줄여주고 디버깅을 쉽게 한다.
- 비트단위 연산자를 사용
- 축약 연산자를 사용
- gate primitive를 사용
- if 조건문을 사용
위 방식을 선택해 모델링하고 테스트벤치를 작성해 기능을 검증
ex) 4비트 입력이 2개인 NOR gate
module file
// assign문 사용
module nor_gate(a,b,y) ;
input [3:0] a, b ;
output [3:0] y ;
assign y = ~(a|b) ; //축약연산자 사용
endmodule
module not_for(a,b,y) ;
input [3:0] a,b ;
output [3:0] y ;
reg [3:0] y ;
integer i ;
// always문 사용
always @(a or b) begin
for(i=0 ; i<4 ; i = +1) ;
y[i] = ~(a[i] | b[i]) ;
end
// gate primitive 사용
nor U0 [3:0] (y,a,b) ;
endmodule
testbench file
module tb_nor() ;
reg [3:0] a,b ;
wire [3:0] y ;
nor_gate U0(a,b,y) ; // nor_gate 인스턴스로 불러옴
initial begin
a = 4'b0000; b=4'b0000;
#10 a = 4'b1010; b=4'b0101;
#10 a = 4'b1100; b=4'b1100;
#10 a = 4'b1011; b=4'b0000;
#10 a = 4'b1001; b=4'b1000;
#10 a = 4'b1111; b=4'b0000;
#10 a = 4'b0010; b=4'b0001;
#10 a = 4'b1101; b=4'b0101;
#10 a = 4'b0000; b=4'b1101;
#10 a = 4'b1111; b=4'b1111;
#10 a = 4'b0111; b=4'b0100;
#10 ;
end
endmodule
ex)Lookup Table
module file
module boot_enc(xin, y,y2,neg) ;
input [2:0] xin ;
output y,y2,neg ;
reg [2:0] tmp ;
assign y = tmp[2] ; // 출력을 3비트로 분리해 할당
assign y2 = tmp[1] ;
assign neg = tmp[0];
always @(xin) begin
case(xin)
0 : tmp = 3'b000;
1,2 : tmp = 3'b001;
3 : tmp = 3'b010;
4 : tmp = 3'b011;
5,6 : tmp = 3'b101;
7 : tmp = 3'b001;
endcase
end
endmodule
testbench file
module tb_booth_enc;
reg [2:0] xin ;
wire y, y2, eng ;
integer i ;
booth_enc U0(xin, y, y2, neg) ; // booth_enc를 인스턴스로 불러옴
initial begin
xin = 0 ;
for(i=1 ; i < 16 ; i = i+1)
#20 xin = i ;
end
endmodule
simulation 결과
'Verilog' 카테고리의 다른 글
[Verilog] Sequential Logic Modeling - Flip Flop (0) | 2022.12.11 |
---|---|
[Verilog] Sequential Logic Modeling - Latch (0) | 2022.12.10 |
[Verilog] Structural modeling - Generate statement (0) | 2022.12.09 |
[Verilog] Structural modeling - module parameter (0) | 2022.12.09 |
[Verilog] Structural modeling - module instance (0) | 2022.12.09 |
Comments