第0章ではNSLの基本的な構造について解説します。
0-1.用語解説
ハードウェア記述言語(HDL:Hardware Description Language)
ASIC、FPGAなどを設計する際に用いるハードウェア設計用のコンピュータ言語のこと。
NSL(New Synthesis Language)
処理記述主体のハードウェア記述言語
構文
NSLの文法に則って記述された文のこと。
モジュール(module)
NSL記述の最小単位のまとまり。
アクション(Action)
1クロックで動作する部分のこと。
アクション記述
モジュール内部の、アクションを表している要素のこと。
共通アクション記述
アクション記述の内、プロシージャ、ファンクション以外で、クロック毎に常に動作している部分のこと。
単位アクション(Atomic Action)
モジュールのアクション記述部分で記述する、アクションの最小単位のこと。
プロシージャ(proc : procedure)
何度も繰り返し使用するアクションを集約した処理手続きのこと。
ファンクション(func : function)
アクション記述をある単位で集約して、モジュール外部や内部から制御端子を通じて呼び出すことができる処理のまとまりのこと。
インスタンス(instance)
サブモジュール構文において、下位となるモジュールを上位モジュール内で宣言した際の” 実体” のこと。
入出力構成要素
モジュールに入力する信号と、モジュールから出力する信号を合わせた要素のこと。
データ端子
数値を入力および出力させる信号線のこと
レジスタ(register)
電子回路やHDL 等で使用する記憶素子のこと。演算の補助や、値の記憶などに使用される。
メモリ
レジスタを配列とすることで、複数のデータを保存できるようにしたもの。
制御端子
モジュール内部に存在するファンクションを起動するための信号線のこと。
内部構成要素
レジスタやプロシージャなどモジュール自身を構成している要素のこと。
ブロック(block)
アクション記述中で、{} により囲まれた部分のこと。par,any,alt,if,seqなどの種類があり、それぞれのブロックが
別々の動作をする。
階層構造
建物の階のように層状に重なった構造のこと。階層構造を実現していると大規模なシステムを構築することが容易になる。NSLでは階層構造を実現するためにサブモジュール構文が使われる。
ブロックトップレベル
どのブロックにも入れ子になっていない、独立したブロックのこと。
MSB/LSB (Most Significant Bit/Least Significant Bit)
NSLでは左端をMSB(最上位ビット)、右端をLSB(最下位のビット)とする。
コンパイル、コンパイル操作
NSL変換エンジンを使用し、NSLソースから下位言語ソースを生成することを指す。またはその操作。
0-2.NSLの基本構造
NSLは、モジュール(module)という単位で開発を行います。
基本的なモジュールの構成は例題0に示します。
例題0の<>で囲まれた構成要素は記述を省略することができます。
<<例題0.モジュールの基本構造>> |
declare モジュール名 { <パラメータ宣言リスト> <入出力構成要素宣言リスト> } module モジュール名 { <内部構成要素の宣言リスト> <アクションリスト> -<共通アクション記述部分> -<ファンクションアクション記述部分> -<プロシージャアクション記述部分> } |
NSLは、モジュールの記述は例題0のように、declare部分とmodule部分で構成しています。
モジュール名以外の各宣言や定義は省略可能ですが、順序を交換してはいけません。
0-3.NSL演算子
次に、文中で使用可能な演算子の一覧を表1に示します。
<<表0-1.NSL演算子>> | |
ビット演算子 | 意味 |
& | ~ ^ | ビット毎の論理積 ビット毎の論理和 ビット毎の論理否定 ビット毎の排他的論理和 |
リダクション演算子 | 意味 |
& | ^ | AND OR EX-OR |
論理演算子 | 意味 |
! && || | 論理否定 論理AND 論理OR |
シフト演算子 | 意味 |
>> << | 右シフト 左シフト |
算術演算子 | 意味 |
+ – * | 加算 減算 乗算 |
関係演算子 | 意味 |
== != > < >= <= | 等しい 等しくない 大なり 小なり 以上 以下 |
ビット演算子 | 意味 |
num#sig sig[num] sig[num1:num2] | 符号拡張 ビット切出し ビット切出し |
その他 | 意味 |
{sig1,sig2,…sigX} num1{num2} if(条件式) sigA else sigB | ビット連結 リピート演算 条件演算 |
NSLの演算子は基本的にVerilog-HDL互換ですが、Verilog-HDLの除算、等号演算の一部にあたる演算子はありません。
また、NSL独自の演算子としてビット拡張があります。
0-4.NSL演算子の優先順位表
表2は、演算子の優先順位表です。
演算子の優先順位は、()括弧を使うことで変更できます。
<<表0-2.演算子の優先順位表>> | ||
優先順位 | 演算子 | 意味 |
1 (高い) | {sigA,sigB,..} numA{numB} num#sig & | ^ ~ ! | ビット結合 リピート演算 符号拡張 リダクションAND リダクションOR リダクションEX-OR NOT 論理NOT |
2 | * | 算術乗算 |
3 | + – | 算術加算 算術減算 |
4 | << >> | 左シフト 右シフト |
5 | <= >= < > | 以下 以上 小なり 大なり |
6 | == != | 等しい 等しくない |
7 | & ^ | AND EX-OR |
8 | | | OR |
9 | || | 論理OR |
10 | && | ビット結合 |
11 (低い) | if() ~ else ~ | 条件演算 |
0-5.値の転送について
回路を設計する上で、目にする場面が多いのが、値や信号の“転送”という動作です。
転送は、ある値や信号を別の信号線に渡すことを指します。
転送は記号”=”を使用して、次のような手順で行います。
信号A = 値B
転送は、”値Bを信号Aに渡す”というアクションを表しています。
また上記の場合、値Bの転送と同クロック内で信号Aに値が渡ります。
以上のように転送は右辺を左辺に渡すアクションです。
次に、レジスタに値を渡す場合について解説します。
レジスタ(Register)は、電子回路やHDLなどで使用する記憶素子のことです。
レジスタに値や信号を転送すると、レジスタは転送した値や信号を、転送の1クロック後に記憶します。
レジスタに値や信号を転送する場合は、
“:=”を使用して、次のように行います。
レジスタA := 値B
この転送は、”レジスタAに値Bを渡す”という事を表しています。
この場合、値Bを転送した次のクロックでレジスタAは値Bを記憶します。
以下の表3に転送コマンドをまとめました。
<<表0-3.転送コマンドの表>> | |
転送コマンド | 意味 |
= := | 信号への転送 レジスタへの転送 |
0-6.数値表記について
NSLでの数値表記は、Verilog-HDL互換と、C言語的表記方法の2種類があります。
Verilog-HDL 互換表記は
<ビット幅>'<基数を表す文字><値>
と表記します。
例えば、10進数の12を4ビット幅の2進数で表す場合は、
<ビット幅>'<基数を表す文字><値>
と表します。
“b” は2進数の英語binaryの略です。
また、例として10進数の5を4ビット幅の10進数で表記する場合は、
4'd5
となります。
このVerilog互換表記の場合、基数を表すアルファベットは以下の表4に対応しています。
<<表0-4.Verilog-HDL互換 数値表記の対応表>> | |
基数を表す文字 | 意味 |
b o d h | 2進数 8進数 10進数 16進数 |
次に、C言語的表記方法では数値表記を、
0<基数を表す文字><値>
のように表します。
この場合、例えば10進数の8を4ビット幅の2進数で表す場合は、
0b1000
と表記します。
このC言語的表記方法では、基数を表すアルファベットは以下の表5に対応しています。
<<表0-5.C言語的表記方法 数値表記の対応表>> | |
基数を表す文字 | 意味 |
b x | 2進数 16進数 |
Verilog-HDL互換の表記では、”値”をビット幅に合わせる必要はありません。
ですが、C言語的表記方法ではビット幅は表記した”値”の幅で決定します。
例として、0x00では8ビットに、0b0000では4ビットに決定します。
0-7.コメントアウトについて
ソース中のコメントはC言語や、Verilog-HDLと同じように //や、/**/を使います。
1行のラインコメントを追加する場合には
// コメント
と表記します。
また、以下がエリアコメントの表記方法です。
/* コメント */
エリアコメントは、/* ~ */で囲んだ部分のみが、コメントアウトとなります。
また、エリアコメントの中にエリアコメントを入れる”ネスト”には対応していませんので、使用を避けて下さい。
尚、エリアコメント中にラインコメントが入ることは問題ありません。
0-8.複数の宣言について
NSLでは、信号線や内部構成要素などを、一文で複数宣言することが可能です。
宣言は、宣言名を”,”カンマで区切ることで複数の宣言を表します。
宣言を複数行う方法は以下の記述を行います。
宣言コマンド 宣言名A, 宣言名B, 宣言名C, ... 宣言名X
また、複数の宣言が可能な要素は以下の表6に示します。
<<表0-6.複数宣言が可能な要素>> | |
入出力構成要素 | 宣言コマンド |
入力データ線 出力データ線 入出力データ線 制御入力端子 制御出力端子 | input output inout func_in func_out |
内部構成要素 | 定義コマンド |
内部端子 レジスタ 制御内部端子 プロシージャ ステート メモリ | wire reg func_self proc_name state_name mem |
0-9.クロック信号/リセット信号について
VerilogHDLやVHDLは、ある信号によって挙動を変化する信号主体の言語です。
対して、NSLはまずモジュールの挙動を記述して動きを決定する処理主体の言語です。
NSLはモジュールのクロックを自動で用意して、単一または多相クロックで動くモジュールを作成します。
またクロックを用意すると同時に、回路のリセット信号も用意します。
この時、クロック信号は“m_clock”、リセット信号は“p_reset”という名前で自動合成します。
なお、リセット名・クロック名はコンパイラ側のオプションで名前を変更することができます。
デフォルトではp_reset,m_clockで自動合成します。
0-10.一文の終わりについて
NSLでは、記述中において一文の終了をセミコロン”;” で表します。
要素の宣言や動作の記述など、記述の最小単位である一文を終了する時は、セミコロンを使用して以下のように終了を確定します。
構成要素の宣言 ;
単位動作記述 ;