Verilogチートシート

ひな形

module ModuleName #(
  // パラメータを宣言
  parameter
    PARAMETER_NAME = 8,
    WIDTH = 8
) (
  // 出力ポートの宣言
  output wire wire_output_port_name,
  output reg reg_output_port_name,
  output reg [WIDTH - 1: 0] multibyte_reg_output_port_name,
  // 入力ポートの宣言
  input input_port_name,
  input [WIDTH - 1: 0] multibyte_input_port_name,
  input reset,
  input clock
);
// パラメータの宣言
localparam LOCAL_PARAMETER_NAME = 8;
localparam DEPTH = 8;

// 信号の宣言
wire wire_signal;
wire [WIDTH - 1: 0] multibyte_wire_signal;
wire [WIDTH - 1: 0] wire_array[DEPTH - 1: 0];
reg reg_signal;
reg [WIDTH - 1: 0] multibyte_reg_signal;
reg [WIDTH - 1: 0] reg_array[DEPTH - 1: 0];

reg [1: 0] r0, r1;
wire [1: 0] w0;
wire w1, w2;

wire submodule_output;

// wireへの接続
assign w0 = w1 + w2;
wire [1: 0] w = w1 + w2;

// regへの接続(clockの立ち上がりに応じてregの値を変化)
always @(posedge clock) begin
  if (reset) begin
    r0 <= 0;
    r1 <= 0;
  end else begin
    r0 <= w1 + w2;
    r1 <= r0[1: 0];
  end
end

// サブモジュールの接続
Submodule #(
  // サブモジュールのパラメータ上書き
  .SUBMODULE_PARAMETER_NAME(PARAMETER_NAME),
  .DEPTH(DEPTH)
) instance_name (
  .submodule_port_name(r0),
  .submodule_output(submodule_output), // サブモジュールの出力はwireのみ接続することができる
  .clock(clock)
);
endmodule

信号の宣言

wire w;
wire [7: 0] w8;
wire [7: 0] warray[1: 0]; // 二次元配列
reg r;
reg [7: 0] r8;
reg [7: 0] rarray[1: 0]; // 二次元配列

定数の宣言

parameter PARAMETER_NAME = 8;
localparam LOCAL_PARAMETER_NAME = 8;

数値

4'b0101 // 二進数
4'd10 // 十進数
4'hA // 十六進数

演算

plus <= a + b;
minus <= a - b;
multiply <= a * b;
divide <= a / b; // 割り算は2の倍数以外使用しないでください
left_shift <= a << 2;
right_shift <= a >> 2;

比較演算

(a < b)
(a > b)
(a >= b)
(a <= b)
(a == b)

ビット操作

bit <= a[2];
sub0 <= a[5: 2]; // 5ビット目から2ビット目を取得
sub1 <= a[5 -: 4]; // 5ビット目より下位4ビットを取得
sub2 <= a[2 +: 4]; // 2ビット目より上位4ビットを取得

merge <= {a, b};
{a, b} <= splice;

wireへの接続

assign wire_name = wire0; // 既存のwireへ接続する
wire new_wire_name = wire0; // 新しくwireを宣言し、接続する

regへの接続

reg0 <= reg1;

if文

if (a[0] == 0) begin
  //
end

if (a[0] == 0) begin
  //
end else if (a[1] == 0) begin
  //
end else begin
  //
end

モジュール接続

SubModuleName instance_name (
  .port_name0(sgnal_name0),
...
  .port_namen(signal_namen)
);

SubModuleName #(
  .SUBMODULE_PARAMETER_NAME(PARAMETER_NAME)
) instance_name (
  .port_name0(sgnal_name0),
...
  .port_namen(signal_namen)
);