はじめに

# このページは,学生実験用資料として筑波大学リコンフィギュラブルコンピューティングシステム研究室のwebページで公開されていたものを,許可を得て転載したものです.


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
  

戻る