wait

2008/08/20Verilog::文法import

待ち処理(TestBench)

Test記述時に有効. 式の評価結果が TRUEになるまで待つ.
initial文でクロックに同期して処理をさせたい場合に使うとよさそう. @(posedge CLK)で十分です.

  always #20 CLK <= ~CLK;

  initial begin
   ...
   wait( CLK==0 );
   wait( CLK==1 );
→ @(posedge CLK);
  # 2  // CLK's posedge + 2 [nSec]
   hoge <= 1;
   ...
  end

wait(式?)

前述のとおり.


@ (式?)

式の状態を待つ?立ち上がり:posedge
立ち下り:negedge
などなど...と思う.調べてないけれども使ったものだけ記述.サイトではなく仕様書を見て転記してこないと、ですね.

task

2008/08/20Verilog::文法import

書式

task <name>;
	// input ; 値渡し. 呼び出しもとのreg等に影響を与えない.
	// output

	// process...
endtask

syntax

task_declaration ::= (From Annex A - A.2.7)
   task [ automatic ] task_identifier ;
     { task_item_declaration }
     statement
   endtask
 | task [ automatic ] task_identifier ( task_port_list ) ;
     { block_item_declaration }
     statement
   endtask

task_item_declaration ::=
  block_item_declaration
  | { attribute_instance } tf_input_declaration ;
  | { attribute_instance } tf_output_declaration ;
  | { attribute_instance } tf_inout_declaration ;

task_port_list ::=
  task_port_item { , task_port_item }

task_port_item ::=
  { attribute_instance } tf_input_declaration
  | { attribute_instance } tf_output_declaration
  | { attribute_instance } tf_inout_declaration

tf_input_declaration ::=
  input [ reg ] [ signed ] [ range ] list_of_port_identifiers
  | input [ task_port_type ] list_of_port_identifiers

tf_output_declaration ::=
  output [ reg ] [ signed ] [ range ] list_of_port_identifiers
  | output [ task_port_type ] list_of_port_identifiers

tf_inout_declaration ::=
  inout [ reg ] [ signed ] [ range ] list_of_port_identifiers
  | inout [ task_port_type ] list_of_port_identifiers

task_port_type ::=
  time | real | realtime | integer

block_item_declaration ::= (From Annex A - A.2.8)
  { attribute_instance } block_reg_declaration
  | { attribute_instance } event_declaration
  | { attribute_instance } integer_declaration
  | { attribute_instance } local_parameter_declaration
  | { attribute_instance } parameter_declaration
  | { attribute_instance } real_declaration
  | { attribute_instance } realtime_declaration
  | { attribute_instance } time_declaration

block_reg_declaration ::=
  reg [ signed ] [ range ]
  list_of_block_variable_identifiers ;

list_of_block_variable_identifiers ::=
  block_variable_type { , block_variable_type }

block_variable_type ::=
  variable_identifier
  | variable_identifier dimension { dimension }


概要

  • 記述はmoduleとほぼ同じ. 許容される型/process文が増える程度.
  • 引数は宣言した順に渡される.名前渡しも可能.(ドット+名前(信号))
  • input引数は値渡しになる.呼び出し元に影響はでない.
  • inout/outputは代入すると呼び元に値を返すことができる.[LRM 10.1]
  • 実回路としてsynthesize不可. simulation modelでのみ使用可能
  • "#値"による待ち処理を入れることができる. task呼び出し元は, task内で消費した時間の後に返ってくる.

その他メモ

if文を用いて、条件によって待ち時間を変化させることもできる.ex.

  if (t_AD > t_CS)  begin
    # (t_CS)
    CS_n <= 0;
    # (t_AD - t_CS)
    ADR <= ADR_buf;
  end
  else begin
    # (t_AD)
    ADR <= ADR_buf;
    # (t_CS - t_AD)
    CS_n <= 0;
  end

※CS_nとADRの変化時間が、パラメタt_ADとt_CSの大小関係により前後するため、分岐させた.後日,CPUバスの試験パターンを振るための例を示す.waveformを外部プログラムで吐いて,取り込んだほうが早かった気がするけれど。。。

Verilog覚書

2008/08/13Verilog::文法import

Verilog記述に関するメモ

Master Reference

OVI版 Verilog-LRM*1 http://www.vlsi-design.net/general/languages/verilog/

名称(IEEE-STD-1364-2001)で検索すると,まぁ,アレゲですが出てきますね.

*1 : Language Referenec Manual

Verilog Reserved Words


reference

参考にさせていただいたサイトをメモしておきます.検索するより便利か?(個人的なメモを兼ねて・・・

2008/03/29(土)久しぶりにHDL

ALTERA

EPM7032VLC44, EPM7128ELC88を拾ってきたのだが、開発ツールが対応していない模様... orz Xilinxに戻るか...

Xilinx

WebPack ISEを使う. 不慣れだがやるしかない.

parameter文

`defineと違って、パラメタ化のために用いる。ただしmoduleの内側でないとだめぽい。一度ハマった... orz詳しいことは後日調べるとしよう。

補足:`defineだと、変数名の頭にアクサンが必要となる模様。ただしglobalな扱い。parameterはmodule内での宣言が必要 == includeで共通外部ファイルを拾ってくるとかしないと、ファイルをまたがって共通化できない。みたい。


例題

とりあえず作ったのはシリパラ変換。しょぼいw

module top(SCLK, SDI, SDO, SLAT, RST_N, PD);
  parameter DF_BIT_MSB = 28;
	input SCLK;
	input SDI;
	output SDO;
	reg SDO ;
	input SLAT;
	input RST_N;
	output [DF_BIT_MSB:0] PD;
	reg [DF_BIT_MSB:0] PD;
	reg [DF_BIT_MSB:0] DFF;


	always @ (posedge SCLK or negedge RST_N) begin
		if (RST_N == 1'b0) begin
			DFF <= 0;
			SDO <= 0;
		end else begin
			DFF <= DFF[DF_BIT_MSB-1:0],SDI;
			SDO <= DFF[DF_BIT_MSB] ;
		end
	end
	
	always @ (posedge SLAT or negedge RST_N) begin
		if (RST_N == 1'b0) begin
			PD <= 0;
		end else begin
			PD <= DFF;
		end
	end

endmodule

さらにadiaryネタ. pre記法は使いづらい. というか, エスケープの仕方や変換のされ方の理解が浅い. >|~|<を使うと、綺麗にpreタグをつかってくれる。>~<だと、変換プロセスが走るようだ。説明とレイが乗っていた気がするが、理解できてなかったようだな。実際に"こう使いたい"と、手を動かし、体で覚えていくしかないわ。何でもかんでもそうだな・・・。