スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[SystemVerilog] ナウでヤングなクロック生成

こんな記述を見かけたのさー

 1|module testbench;
 2|
 3|  reg CLK=0;
 4|
 5|  parameter CLK_PERIOD=100;
 6|
 7|  always #(CLK_PERIOD/2) begin
 8|  ¦ CLK <= ~CLK;
 9|  ¦ #(CLK_PERIOD - (CLK_PERIOD/2));
10|  ¦ CLK <= ~CLK;
11|  end
12|
13|  initial begin
14|  ¦ #10000;
15|  ¦ $finish(1);
16|  end
17|
18|endmodule
  • A君
    parameterを使っているということは、
    「CLK」の周期を変えたい時があるということかな?

  • Bさん
    でもその時って、defparamとかでやっちゃうのかな?
    それって再度コンパイルするの?
    やだー!!!ダサい!!!

さてさて、どうしましょう!?
どうやら今時はこんな記述らしい!
※今時かは知らないです。

 1|module testbench;
 2|
 3|  reg CLK=0;
 4|  int v_period;
 5|
 6|  initial begin
 7|  ¦ if ($value$plusargs("CLK_PERIOD=%d", v_period))
 8|  ¦ ¦ $display("CLK_PERIOD set %d", v_period);
 9|  ¦ else
10|  ¦ ¦ v_period = 100;
11|
12|  ¦ forever begin
13|  ¦ ¦ #(v_period/2);
14|  ¦ ¦ CLK <= ~CLK;
15|  ¦ ¦ #(v_period - (v_period/2));
16|  ¦ ¦ CLK <= ~CLK;
17|  ¦ end
18|  end
19|
20|  initial begin
21|  ¦ #10000;
22|  ¦ $finish(1);
23|  end
24|
25|endmodule  

「CLK」の周期を変える時は、実行時の引数で指定すれば コンパイル不要だよ-☆

:
# vsim +CLK_PERIOD=20 -L work -do {run -all; quit} -c testbench 
# Loading sv_std.std
# Loading work.testbench
# run -all 
# CLK_PERIOD set          20
# ** Note: $finish    : sample2.sv(22)
#    Time: 10 ns  Iteration: 0  Instance: /testbench

ってことで終わり。

スポンサーサイト

[SystemVerilog] レポートパッケージに figlet対応

この記事は HDL Advent Calendar 2015の 1日目の記事です。
参加者の数がヤバいので、ぜひ参加してください!
こんなしょーもない記事で結構ですので。

さて、2015年もあと一ヶ月ですよ。(えっ?

レポートパッケージライブラリ

2013年の最後にこんなの作ろうと思ってそのままにしてました。
今年のアドベントカレンダーのネタに更新内容を。

github.com/Kocha/systemverilog-report-package

更新内容

figlet で表示させるようにしてみました。

  • 試しのサンプルソース

    `include "report_macros.svh"
    
    module testbench ();
    
      import report_pkg::*;
    
      initial begin
        info_figlet("Test");
        info_figlet("Test", "block");     // font = block
        info_figlet("Test", "big", "-c"); // font = big, Centor
    
      end
    
    endmodule: testbench

の実行結果がこちらになります。

20151201_sv_report.png

これでより、強調したメッセージを表示出来るようになりましたね!
検証でエラーがが出たら、Bug!Bug!って出してあげましょう。

軽くジョブにもならない記事でしたが、アドベントカレンダーまだまだ続きます。

明日は @natsutan さんです。

[SystemVerilog] 多次元配列の force/release

多次元配列に対しての force/release記述で
ちょっとハマったのでメモ。

logic [15:0] tb_clock = '0;

always #(5)  tb_clock[0]  = ~tb_clock[0] ;
always #(5)  tb_clock[1]  = ~tb_clock[1] ;
//:
always #(5)  tb_clock[15] = ~tb_clock[15] ;

と書いており、個々のクロックのON/OFFさせてみて、 動作を確かめようとした際に、

force tb_clock = '0;

#100;

release tb_clock[0];

#1000;

と書いても、tb_clock[0]は releaseされていない。
結果として以下のように書くべきとのこと。

force tb_clock[0]  = 0;
force tb_clock[1]  = 0;
//:
force tb_clock[15] = 0;

#100;

release tb_clock[0];

#1000;

うーん。。。(´ε`;)ウーン…
そんなものかなー

[SystemVerilog] 色々なライブラリ

SystemVerilogでいくつかのパッケージライブラリが出ているみたい。

文字列操作とか、同じ感じのが多いですね。

全然違うけど、GitHub凄いな。

とかあるし。調べればもっと色々ありそう。

[SystemVerilog] 文字列の連結

SystemVerilogから追加された String型について。

文字列の連結について LRMに記載があります。
「Table 6-9 String operators」

{Str1,Str2,...,Strn}

ということで、試してみました。
※ModelSim-ASE 10.1dです。

module testbench ();

  initial begin
  ¦ string str_sub = "--- test [";
  ¦ string str = {str_sub, "No", "] = 100"};
  ¦ $display("%s",str);
  end

endmodule: testbench

実行結果はこちら。

# --- test [No] = 100

連結できてますね。
次に、$displayに直接書くと

module testbench ();

  initial begin
  ¦ $display({"--- test [","No", "] = 100"});
  end
endmodule: testbench

そして、実行結果が・・・

# 1007468942646978665954445094271410650903294000

なんとこんな数字達が・・・

  ¦ $display("%s", {"--- test [","No", "] = 100"});

ってやると、綺麗に表示されます。
ほぉー

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。