2019年6月16日日曜日

verilog : よく使用する RTL 記述

目的:

通常、よく使用する RTL記述 (論理合成可能な 論理記述) について記す。

RTL記述例:

assign 文 : 組み合わせ回路の記述を行う。

assing out = in1 & in2 ;    // 演算子 : (ビット)  & (and), | (or), ^ (xor), ~(not)
                                      //              (算術)   +, -
                                      //              (比較)   <, <=, >=, >, ==, !=, ===, !==
                                      //              (論理)   &&, ||, !
                                      //              (シフト)  >>, <<, <<<, >>>
                                      //              (条件(3項))  <条件> ? <真> : <偽> 
                                      //              (連接)   {<信号>,<信号>, ... }

連接 : 記述の仕方いろいろ。

{ sig1 , sig2, sig3 }     // 信号を連接
{ 7{1'b0},sig1}           //  sig1 の前に 7bit の'0' を付加
{{(P_BW-1){1'b0}},sig1}   //  sig1(1bit 信号) を bit幅 P_BW に 0拡張

bit幅が パラメータ になっている場合の 固定値('1') 代入の例
reg  [P_BW-1:0] sig ;
reg  [P_BW-1:0] sig2 ;

always @(posedge clk or posedge clr)
  if (clr )
    sig <= {{(P_BW-1){1'b0}},1'b1} ;   // P_BW'h1 とは 書けない為
  else
    sig  <= sig2 ;

always 文 : 順序回路 (FF) の記述を行う。

always @(posedge clk or negedge rst)  // rst は 非同期リセット(負極性)
  if (~rst)                           // リセット 時 (rst が '0' の時)
    q <= #1 1'b0 ;                    //   出力を 'L' にする
  else                                // 非リセット時

    q <= #1 d ;                       //   出力に入力を伝搬させる

function 文:if文 や case文 を使用した組み合わせ回路の記述を行う。
       複数の組み合わせ回路を 1組にして記述して使い回す時にも使用。

function [7:0] sel;
  input [1:0] in1 ;
  input [7:0] in2 ;
  begin
    case(in1)
      2'b00 : sel = 8'd0 ;
      2'b01 : sel = in2 ;
      2'b10 : sel = ~in2 ;
      default : sel = 8'hff ;
      endcase
  end
endfunction

assign out = sel(i1,i2) ;

 module 呼び出し : 下位 module を呼び出す。

test test1(           // <module名:test>  <インスタンス名:test1> (
  .in1 (sig1),        //    .<ポート名:in1>  (<接続信号名:sig1>),
  .in2 (sig2),        //    .<ポート名:in2>  (<接続信号名:sig2>),
  .out (sig3)         //    .<ポート名:out>  (<接続信号名:sig3>),
) ;                   //


3項演算子 : セレクタの記述等に使用


assign out = (i1 == 2'b00) ? 8'd0 :
             (i1 == 2'b01) ? in2   :
             (i1 == 2'b10) ? ~in2  :
                             8'hff  ;

( 上記 function 文の例と同じ回路 )

 genarete文 : 大量の assign 記述等を for 文を使用して記述する場合に使用。

wire [9:0] bus1 ;
wire [9:0] bus2 ;

genvar i;
generate 
  for(i=0; i<10; i=i+1) 
    begin : Gen1                         // begin の後に ラベルが必用 ?
      assign bus2[i] = bus1 [9 - i] ;  
    end
endgenerate

0 件のコメント:

コメントを投稿