目的:
通常、よく使用する 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 件のコメント:
コメントを投稿