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

0 件のコメント:

コメントを投稿