スポンサーサイト

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

[SystemVerilog] Streaming operators

ぼっち SystemVerilog読書会 にて出てきた記述になります。

※LRM上では p240 ぐらいの話です。

  • サンプルコード
  •  1|module testbench ();
     2|
     3|  reg[7:0] a, b;
     4|  reg[5:0] c, d;
     5|
     6|  initial begin
     7|    #100;
     8|    a = { << { 8'b0011_0101 }}; $display("a = %b", a);
     9|    b = { >> { 8'b0011_0101 }}; $display("b = %b", b);
    10|    $display("");
    11|    c = { << 4 { 6'b11_0101 }}; $display("c = %b", c);
    12|    d = { >> 4 { 6'b11_0101 }}; $display("d = %b", d);
    13|    $finish(2);
    14|  end
    15|
    16|endmodule: testbench
  • 実行結果
  • # a = 10101100
    # b = 00110101
    #
    # c = 010111
    # d = 110101
    

説明

はい。なんのことかサッパリわかりませんね!

{ << {}} の場合はこんな感じになります。


|[7]|[6]|[5]|[4]|[3]|[2]|[1]|[0]|

|[0]|[1]|[2]|[3]|[4]|[5]|[6]|[7]|


となると、c のやつは 4bit単位で区切られているので、

|[5:4]|[3:0]|

|[3:0]|[5:4]|

というようになります。

  • 応用編

では、LRMに書かれている以下のコードはどう考えればいいかというと

{ << 2 { { << { 4'b1101 }} }}

まず最初に { << { 4'b1101 }} の部分です。この結果は、

|[3]|[2]|[1]|[0]|

|[0]|[1]|[2]|[3]|

になるので、「4'b1011」つまり

{ << 2 { 4'b1011 }}

となります。とすると結果は、

|[3:2]|[1:0]|

|[1:0]|[3:2]|

になりますので、「'b1110」となります。


※もし、私の理解が間違っていたらコメントいただれば嬉しいです。

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
07 | 2017/08 | 09
- - 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 31 - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。