ラベル Verilog の投稿を表示しています。 すべての投稿を表示
ラベル Verilog の投稿を表示しています。 すべての投稿を表示

2022年1月5日水曜日

Procedural-continuous assignments

Verilog では以下のように always の中に assign 文を入れることが出来るらしい(@ryos36さんのTwitterから).
  1. module dff (q, d, clear, preset, clock);
  2. output q;
  3. input d, clear, preset, clock;
  4. reg q;
  5.  
  6. always @(clear or preset)
  7. if(!clear)
  8. assign q = 0;
  9. else if(!preset)
  10. assign q = 1;
  11. else
  12. deassign q;
  13.  
  14. always@(posedge clock)
  15. q = d;
  16. endmodule
always 文の中に assign を入れる構文は Procedural-continuous assignments (手続き文の継続的代入?)と呼ぶらしく,DesignCompiler では「Procedural-continuous assignments は合成できないよ」とエラーが出た.純粋に動作モデルを立てるために使うのだろう.

2019年8月1日木曜日

ゲートレベルシミュレーションにおけるFFのリセット

リセットのない FF のゲートレベルシミュレーションを行うと,初期値がないので X が伝搬してしまう.Verilog HDL では force / release を使い値の強制設定と解除が可能であるが,うまく force / release しないと X の伝搬を防ぐ事ができない.特に実負荷シミュレーションではクロックスキューもあるので,release のタイミングと実際にクロックが入るタイミングがずれる問題もある.

普通に force / release してもうまくいかない時の対策
・複数サイクルにかけて force を入れる
・FF のデータ入力だけでなく出力端子にも force を入れる

以下のようなPerlスクリプトを書いて,DATA端子とQ端子を探し force / release していました.

  1. #!/bin/perl
  2.  
  3. open (IN,"$ARGV[0]");
  4.  
  5. @INA=<IN>;
  6. @DATAA;
  7.  
  8. # find wires connecterd to DFF
  9. for(my $i=0;$i<scalar(@INA);$i++){
  10. if($INA[$i] =~ /\.DATA/) {
  11. @sparray = split(/\s+/,$INA[$i]);
  12. for(my $k=0;$k<=$#sparray;$k++){
  13. if($sparray[$k] eq "\.DATA") {
  14. push (@DATAA, $sparray[$k+2]);
  15. }
  16. }
  17. }
  18. if($INA[$i] =~ /\.Q/) {
  19. @sparray = split(/\s+/,$INA[$i]);
  20. for(my $k=0;$k<=$#sparray;$k++){
  21. if($sparray[$k] eq "\.Q") {
  22. push (@DATAA, $sparray[$k+2]);
  23. }
  24. }
  25. }
  26. }
  27.  
  28. # print force
  29. for(my $i=0;$i<=$#DATAA;$i++){
  30. printf("force TOP.$DATAA[$i]=0;\n");
  31. }
  32. printf("\#10\n");
  33. for(my $i=0;$i<=$#DATAA;$i++){
  34. printf("release TOP.$DATAA[$i];\n");
  35. }
force / release の使い方はこちら. http://kawaiihaseigi.blogspot.com/2017/07/verilog-force.html

2017年7月21日金曜日

Verilog における force 文メモ

非同期分周器のVerilogシミュレーションでforce文を使ったのでメモ.

Verilogで特定のノードの値を強制的に指定するために,force文を使う.force文の指定を解除するためには,release文を使う.非同期分周器の場合,分周器の入力に対して強制的に値を指定し,クロック立ち上がりを入力し値をDFFに取り込む.次に,release文を使う事でforce文を解除する.

  1. module tb();
  2.  
  3. reg CLK;
  4. wire OUT;
  5.  
  6. always begin
  7. #5 CLK <= ~CLK;
  8. end
  9.  
  10. // dut
  11. DIV INST_DIV(
  12. .CLK(CLK),
  13. .OUT(OUT)
  14. )
  15.  
  16. initial begin
  17. CLK <= 1;
  18. force INST_DIV.invout=1;
  19. #10
  20. release INST_DIV.invout;
  21. end
  22. endmodule
  23.  
  24. module DIV(
  25. .CLK,
  26. .OUT
  27. );
  28. input CLK;
  29. output OUT;
  30. wire invout;
  31.  
  32. inverter(.A(OUT), .YB(invout));
  33. dff(.CLK(CLK), .DATA(invout), .Y(OUT));
  34.  
  35. endmodule

2013年8月1日木曜日

NC-Verilogにおける実負荷シミュレーションのバッドノウハウ

NC Verilogを使ってSDFをアノテートしたシミュレーションをする時,アノテーションの手法は以下の2つがある.
  1. Verilogテストベンチ中に$sdf_annotate("file", module)を使う
  2. NC Verilog起動時に+sdf_file+<file>を引数で与える
これらの手法のうち,(1)で以下のワーニングが発生しうまくアノテーションできずはまった.

 ncelab: *W,sdfNET: failed Attempt to annotate to non-existent path...

しかし,同じファイルであっても(2)を試すとうまくいく.よくわからないが,(1)と(2)ではサポートしているSDFの構文が違うのだろうか.利用したのはncverilog 06.20-s004 (IUS62)である.
なお,(2)は+sdffile<file>と"+"なしでも正しくアノテーション可能である.

SDFをアノテーションすると当たり前だが各セル,配線遅延を想定したシミュレーションになる.従ってテストベンチのクロック周期を想定する回路のクロック周期に設定しないと当たり前だがタイミング違反になる.
Verilogシミュレーションにおいて,セットアップ違反はホールド違反として報告されることがある.早とちりせずに2つのタイミング違反の可能性について調査する必要がある.

何も考えずにシミュレーションをしていたところ,回路を100GHzでシミュレーションしてしまい結果ホールド違反(と思わせたセットアップ違反)がモリモリでてきて悩んでしまった.情けない.