Introduction to SystemVerilog. Combination circuit (basic gate, adder, multiplexer, tri-state buffer)
組合わせ回路
SystemVerilogで簡単な組合わせ回路を記述してみる。
論理ゲート
論理ゲート(logic_gates.sv)
基本的な論理ゲートの記述例。入出力ビット幅はパラメータで指定する。
/* logic_gates.sv */ module logic_gates #(parameter WIDTH=1) (input [WIDTH-1:0] a,b, output [WIDTH-1:0] y1,y2,y3,y4,y5); assign y1 = a & b; //AND assign y2 = a | b; //OR assign y3 = a ^ b; //XOR assign y4 = ~(a & b); //NAND assign y5 = ~(a | b); //NOR endmodule
Nbit論理積(andNbit.sv)
リダクション演算の記述例。リダクション演算を用いて4bit入力信号のaの各ビットの論理積を計算している。
/* andNbit.sv */ module andNbit #(parameter WIDTH=4) (input [WIDTH-1:0] a, output [WIDTH-1:0] y); // y = a[0] & a[1] & a[2] & a[3] assign y = &a; //リダクション演算 endmodule
加算器
1bit全加算器の記述例。
全加算器(adder.sv)
/*adder.sv*/ module adder (input a, b,cin, output s, cout); logic p,g; assign p = a ^ b; assign g = a & b; assign s = p ^ cin; assign cout = g | (p & cin); endmodule
Nbit全加算器(adderNbit.sv)
Nbit全加算器の記述例。パラメータにてbit幅を指定。
/*adderNbit.sv*/ module adderNbit #(parameter WIDTH=4) (input [WIDTH-1:0] a, b, input cin, output [WIDTH-1:0] s, output cout); assign {cout, s} = a + b + cin; endmodule
マルチプレクサ(セレクタ)
1bit2to1マルチプレクサ(mux.sv)
1bit2入力1出力のマルチプレクサの記述例。信号selの値によって入力信号d0、d1を選択する。
/*mux.sv*/ module mux (input d0,d1,sel, output s); assign s = (sel==1'b0)? d0 : d1; endmodule
Nbit2to1マルチプレクサ(muxNbit2to1.sv)
こちらは上述したマルチプレクサのNbit版。パラメータNにてビット幅を指定する。
/* muxNbit2to1.sv */ module muxNbit2to1 #(parameter WIDTH=4) (input [WIDTH-1:0] d0,d1, input sel, output [WIDTH-1:0] s); assign s = (sel==1'b0)? d0 : d1; endmodule
トライステートバッファ
トライステートバッファ(tristate.sv)
トライステートバッファの記述例。en(許可信号)により有効な出力(a)かZ(ハイインピーダンス)かを選択する。
/* tristate.sv */ module tristate #(parameter WIDTH=1) (input [WIDTH-1:0] a, input en, output [WIDTH-1:0] y); assign y = (en)? a : 1'bz; endmodule