Verilogにおいて、処理の単位をモジュールと言います。モジュールの基本的な形は以下のようになります。 コンパイラ指定子
module モジュール名(ポートの宣言);
定数の宣言
...
信号、変数の宣言
...
処理の記述
... タスク、関数の宣言 ...
下位モジュールの接続
... endmodule
サンプル以下にVerilogのモジュールのサンプルを示します。 // コンパイラ指定子 `timescale 1ns / 1ns
module Stack #(
// パラメータの宣言 parameter WIDTH = 2,
parameter DEPTH = 2,
parameter INIT = 2'b0,
parameter RESET_COMMAND = 2'b0,
parameter PUSH_COMMAND = 2'b10,
parameter POP_COMMAND = 2'b11
) ( // ポートの宣言
output wire [WIDTH - 1: 0] out,
input [WIDTH - 1: 0] in,
input [1: 0] command,
input clock
); // 定数の宣言
parameter STACK_WIDTH = WIDTH * DEPTH;
// 信号、変数の宣言 integer i;
reg [STACK_WIDTH - 1: 0] stack;
// 処理の記述 assign out = stack[0 +: WIDTH];
always @(posedge clock) begin
case(command)
RESET_COMMAND:
for(i = 0; i < DEPTH; i = i + 1) begin
stack[i * WIDTH +: WIDTH] <= INIT;
end
PUSH_COMMAND:
stack <= {stack[0 +: STACK_WIDTH - WIDTH], in};
POP_COMMAND:
stack <= {INIT, stack[STACK_WIDTH - 1: WIDTH]};
default:
stack <= stack;
endcase
end
endmodule
以下に上記のモジュールStackをテストするためのモジュールのサンプルを示します。 `timescale 1ns / 1ns
module TestStack();
// クロックの周期 parameter PERIOD = 20;
// スタックについてのパラメータ
parameter WIDTH = 8;
parameter INIT = 8'hFF;
parameter DEPTH = 16;
parameter RESET = 2'b00;
parameter STAY = 2'b01;
parameter PUSH = 2'b10;
parameter POP = 2'b11;
// Stackに接続する信号
reg [WIDTH - 1: 0] in;
wire [WIDTH - 1: 0] out;
reg [1: 0] command;
reg clock;
// クロックの生成 initial begin
clock = 1; // ちょっとクロックをずらす
#(PERIOD / 4)
forever begin
#(PERIOD / 2) clock = 0;
#(PERIOD / 2) clock = 1;
end
end
// commandの生成 initial begin
command = RESET;
forever begin
#(PERIOD * 4) command = PUSH;
#(PERIOD * 4) command = STAY;
#(PERIOD * 4) command = POP;
end
end
// 入力信号の生成 always @(posedge clock) begin
case (command)
RESET:
in <= INIT;
PUSH:
in <= in + 8'b1;
default:
in <= in;
endcase
end
// 下位モジュールの接続 Stack #(
.WIDTH(WIDTH), .DEPTH(DEPTH), .INIT(INIT),
.RESET_COMMAND(RESET), .PUSH_COMMAND(PUSH), .POP_COMMAND(POP)
) stack (
.out(out), .in(in), .command(command), .clock(clock)
);
endmodule
|