並列(並行)処理と同時性 について考察するにあたり、
STARC RTL設計スタイルガイドの参考例を実際にコンパイルしてみて、現状を確かめる。
STARC RTL設計スタイルガイド 2.3.2
ブロッキング代入とノンブロッキング代入
論理回路を実際に作るには、デジタル電子回路として実装する。
論理的には、時間を捨象し、瞬時に実行し、実行時間を考えない。
電子回路では、電荷が貯まったり、電荷を放出するのに時間がかかり、遅延(delay)、揺らぎ(jitter)を評価する。
論理的なHDL(hardware description language)で記述する際に、
並列(並行)処理で行うこと、時間的な同時性、遅延、揺らぎを考慮して、
設計意図がうまく実装できるようにすることを考える。
Verilog-HDL, VHDLで記述する際に参考になるのが、

RTL設計スタイルガイド VHDL編―LSI設計の基本 培風館(2011/06)
値段:¥ 7,980

RTL設計スタイルガイド Verilog HDL編―LSI設計の基本 培風館(2011/06)
値段:¥ 9,240
ここでは、並列(並行)処理、同時性、遅延、ゆらぎに関連する規則、情報を列記し、設計段階への準備を行う。
例として掲載しているのは設計の一部で、道具にそれだけ入れてもコンパイルできるとは限らない。そこで、コンパイルできる状態にしながら考える。
1 論理図生成
2 模擬試験(simulation)
3 FPGAへの実装、動作確認
のいずれかの方法を取る。
2章 RTL記述テクニック
2.3. FFの推定
2.3.2. ノンブロッキング代入文とブロッキング代入文では回路が異なる(Verilog HDL only)
① FF推定でノンブロッキング代入文(<=)とブロッキング代入文(=)との間では、
合成後の回路が異なることがある<参考>
② ノンブロッキング代入文とブロッキング代入文を混在させない(Verilog HDL only)<必須>
ブロッキング代入(=)は、逐次処理、ノンブロッキング代入(<=)は並列処理。
混在すると、何と何を同時に実行するか分かりにくくなる。あるいは、意図しない状態になるかもしれない。
ブロッキング代入とノンブロッキング代入のFF
図2-3
ブロッキング代入文(=)
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: NMIRI
// Engineer: Ogawa Kiyoshi
//
// Create Date: 17:28:20 02/19/2013
// Design Name:
// Module Name: starc_verilog_2_3_2(blocking)
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Revision 0.02 - Add output.
//Revision 0.03 -
starc_verilog_2_3_2
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module starc_verilog_2_3_2(clk,d_in,c_out);
input clk, d_in;
output c_out;
wire d_in;
reg a,b,c_out;
always @(posedge clk) begin
a = d_in;// blocking
b = a;// blocking
c_out = b;// blocking
end
endmodule

ブロッキング代入という言葉から、何かを阻止している。
逐次実行であるから、記憶領域が要るような気がする。
実装は、逐次実行した結果を実現する回路を生成する。
代入した結果だけを配線し、経過は配線しない。
ノンブロッキング代入文(<=)
module starc_verilog_2_3_2non(clk,d_in,c_out);
input clk, d_in;
output c_out;
wire d_in;
reg a,b,c_out;
always @(posedge clk) begin
a <= d_in;// non blocking
b <= a;// non blocking
c_out <= b;// non blocking
end
endmodule

ノンブロッキング代入という言葉と、並行実行という言葉から、すぐに処理が終わる並列回路を想像するかもしれない。並行実行するのは、個々の処理である。並行実行した結果は、次の並行実行のために保持する必要がある。そのため、並行実行の数が増えれば、保持する記憶領域の数が増える。論理的に並行実行するものが、回路として直列に並行実行する場合と、並列に並行実行する場合とがあることがわかればよい。
今回は、ISE WebpackのVerilog HDLのファイル生成機能が作成した注釈部分をそのまま利用した。
変数名はなるべくそのまま利用する。ただし以下の命名規則に従う。
1 なるべく3文字以上とする。ただし、内部のみで利用するものは1文字も許す。ガイドの名前と1対1対応がつけやすい名前を選ぶ。
2 入出力(input, output)、時間(clock)、再設定(reset), 有効(enable)などの信号の機能が分かる名前を利用する。
3 規則番号をファイル、モジュール名に入れる。
<この稿は書きかけです。順次追記します。>
作業としては、
1 新しいプロジェクトを作成する
2 新しいモジュールを作成する。
必要があれば、既存のファイルから類似の部分を切り貼りする。
モジュールで生成した回路が妥当であれば、試験例(test bench)を作成する。
3 試験例を生成は、新しいVerilog Test Fixtureを作成する。
必要があれば、既存のファイルから類似の部分を切り貼りする。
この方法は、
フォルダ内に不要なファイルを複写しないようにする。
自動生成機能を有効に利用する。
ため。
@kaizen_nagoya
http://bit.ly/X9scQK #STARC #RTL設計スタイルガイド #Verilog-HDL 2.3.2
#ブロッキング代入 と #ノンブロッキング代入