FC2カウンター FPGAの部屋 SystemVerilog

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado 2104.2でSystemVerilog をやってみた7(アンパック型配列とパック型配列2)

今回は、”AR# 51836 Vivado 合成のデザイン アシスタント - SystemVerilog - 集合体データ型”のアンパック型配列サンプル (aggregate_data_types_example1.zip) とパック型配列サンプル (aggregate_data_types_example2.zip) のシミュレーションを行う。

共通に使用するテストベンチ (array_tb.sv) をまずは下に貼っておく。

`timescale 1ns / 1ps

module array_tb;
    parameter DELAY = 5;

    logic   clk;
    logic   [7:0]   address;
    wire    [7:0]   data;
    logic           cs;
    logic           we;
    logic           oe;

    logic   [7:0]   dout;

    array_unpacked array_unpacked_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

    assign data = dout;

    initial begin
        cs = 1'b1;
        oe = 1'b0;
        we = 1'b0;
        address = 8'h0;
        dout = 8'h12;

        @(posedge clk);    // next rising clock
        #DELAY;
        @(posedge clk);    // next rising clock
        #DELAY;
        we = 1'b1;  // Write

        @(posedge clk);    // next rising clock
        #DELAY;
        dout = 8'hzz;
        we = 1'b0;
        
        @(posedge clk);    // next rising clock
        #DELAY;
        oe = 1'b1;

        @(posedge clk);    // next rising clock
        #DELAY;
        @(posedge clk);    // next rising clock
        #DELAY;
        oe = 1'b0;
        
        @(posedge clk);    // next rising clock
        #DELAY;
        address = 8'h8;
        dout = 8'h34;
        we = 1'b1;  // Write

        @(posedge clk);    // next rising clock
        #DELAY;
        dout = 8'hzz;
        we = 1'b0;
        
        @(posedge clk);    // next rising clock
        #DELAY;
        oe = 1'b1;

        @(posedge clk);    // next rising clock
        #DELAY;
         @(posedge clk);    // next rising clock
        #DELAY;
       oe = 1'b0;
    end

endmodule


まずは、アンパック型配列サンプル (aggregate_data_types_example1.zip) の Behavioral Simulation を行った。表示された波形を下に示す。
SystemVerilog_30_140812.png

0番地には 12 が Write できて、Read もできている。(点線のカーソル部分) 8番地は、34 を Write して、Read 時に xx となっている。(実線のカーソル部分)

次に、Post-Synthesis Simulation を行った。表示された波形を下に示す。
SystemVerilog_33_140813.png

0番地に 12 を Write したはずが、Read では00 が読めた。(点線のカーソル部分) 8番地は、34 を Write して、Read 時に 34 を Read できている。(実線のカーソル部分)

Behavioral Simulation と Post-Synthesis Simulation の結果が全く違う。どうしたことだろう?

次に、Post-Implemantaion Simulation を行った。表示された波形を下に示す。
SystemVerilog_34_140813.png

Post-Synthesis Simulation の結果と同様な結果が得られた。

次に、パック型配列サンプル (aggregate_data_types_example2.zip) のシミュレーションを行った。

最初に、Behavioral Simulation を行った。表示された波形を下に示す。
SystemVerilog_35_140813.png

アンパック型配列の Behavioral Simulation と同様の波形だった。

次に、、Post-Synthesis Simulation を行った。表示された波形を下に示す。
SystemVerilog_36_140813.png

0番地に 12 を Write して、Read した結果も、8番地に 34 を Write して Read した結果も、00 となった。

次に、Post-Implemantaion Simulation を行った。表示された波形を下に示す。
SystemVerilog_37_140813.png

Post-Synthesis Simulation と同様に、0番地に 12 を Write して、Read した結果も、8番地に 34 を Write して Read した結果も、00 となった。

アンパック型配列サンプル (aggregate_data_types_example1.zip) とパック型配列サンプル (aggregate_data_types_example2.zip) のシミュレーション結果は、 Behavioral Simulation と、Post-Synthesis Simulation 、Post-Implemantaion Simulation の結果が違ってしまった。これはなぜだろう?論理合成結果は正しいのだろうか?
  1. 2014年08月13日 04:14 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた6(アンパック型配列とパック型配列)

今回は、”AR# 51836 Vivado 合成のデザイン アシスタント - SystemVerilog - 集合体データ型”のアンパック型配列サンプル (aggregate_data_types_example1.zip) とパック型配列サンプル (aggregate_data_types_example2.zip) を同時にやってみる。

アンパック型配列は、(aggregate_data_types_example1.zip の array_unpacked.sv から引用)

reg [DATA_WIDTH-1:0] mem [ADDR_WIDTH-1:0]; //Unpacked array declaration

で、パック型配列は、(aggregate_data_types_example2.zip の array_packed.sv から引用)

reg [DATA_WIDTH-1:0] [ADDR_WIDTH-1:0] mem ; //packed array declaration

ということだ。

まずは、aggregate_data_types_example1.zip の array_unpacked.sv からインプリメントしてみよう。このファイルは .sv とSystemVerilog の拡張子がついていても、Verilog で書かれているファイルだ。プロジェクトのボードは、ZedBoardを使用した。
インプリメントは成功したので、Implemented Design を表示してみる。
SystemVerilog_28_140811.png

address が3ビットしか無くなっている。それもそのはず、

reg [DATA_WIDTH-1:0] mem [ADDR_WIDTH-1:0]; //Unpacked array declaration

は、reg [DATA_WIDTH-1:0] mem を ADDR_WIDTH 個インスタンスしたということであるので、ADDR_WIDTH = 8 なので、8個インスタンスするには、3ビットしかアドレスが必要ないため後の5ビットのアドレスは消されてしまった。。。

次に、パック型配列の aggregate_data_types_example2.zip の array_packed.sv のプロジェクトを作成して、インプリメントしてみた。プロジェクトのボードは、ZedBoardを使用した。
array_packed.sv のアドレスは 1024ビット幅で、データは 16ビット幅だったので、 array_packed_top.sv を作成して、アンパック型配列同様のアドレス 8ビット幅、データ 8ビット幅に書きなおした。
array_packed_top.sv を下に貼っておく。

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2014/08/11 05:26:43
// Design Name: 
// Module Name: array_packed_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module array_packed_top(
    input clk,
    input [7:0] address,
    inout [7:0] data,
    input cs,
    input we,
    input oe
    );
    
    array_packed #(
        .DATA_WIDTH(8),
        .ADDR_WIDTH(8)
    ) array_packed_i (.*);
    
endmodule


インプリメントを行ったところ成功した。Implemented Design を表示してみると、address が8ビット分残っている。256個のメモリセルをインスタンスできていると思われる。
SystemVerilog_29_140811.png

アンパック型配列とパック型配列の違いは、実際にはこの辺りの違いが大きいのではないか?と思う。

(2014/08/12:追記)
アンパック型配列とパック型配列では、同じく8個のメモリがインスタンスされていた。
パック型配列では、8ビットのアドレスが残っていたが、アドレスは1つずつ8ビット単位のメモリ素子のイネーブルに接続されているようだった。
SystemVerilog_31_140812.png 

アンパック型配列では、8個のメモリ素子に接続されている。
SystemVerilog_32_140812.png

アンパック型配列は普通のメモリになっているが、パック型配列はこれでよいのだろうか?
  1. 2014年08月12日 14:10 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた5(data_types_example4)

今回は、”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”の data_types_example4.zip をやってみようと思う。

Vivado 2014.2 を立ち上げて data_t_ex4 プロジェクトを作成した。使用するボードを ZedBoard に設定した。今回のデータ型のサンプルはtype operator だ。下位モジュールのパラメータでポートのデータ・タイプを変更することができるようだ。

インプリメントを行い成功した。
SystemVerilog_23_140810.png

どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_24_140810.png

インプリメントするとDelay はなくなってしまうので、2つの adder が並んでいる。

実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_25_140810.png

これだとよくわからないので、中央部分を拡大した。
SystemVerilog_26_140810.png

入力から、IBUFを通して、adder に接続され、adder からOBUF を通して出力しているのがわかる。

テストベンチ (top_tb.sv) を作成して、Vivado Simulator でシミュレーションを行った。
SystemVerilog_27_140810.png

今回も前回同様に、Vivado 2014.2 Simulator でシミュレーションを行うことができた。

最後に、top_tb.sv を貼っておく。

`timescale 1ns / 1ps

module traffic_light_tb;
    parameter DELAY    = 5;

    logic           sensor;
    logic [15:0]    green_cnt;
    logic [15:0]    yellow_cnt;
    logic           clk;
    logic           rst;
    logic           green_light;
    logic           yellow_light;
    logic           red_light;

    traffic_light traffic_light_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

    initial begin
        rst = 1'b1;
        #20 rst = 1'b0;
    end

    initial begin
        sensor = 1'b0;
        green_cnt = 5;
        yellow_cnt = 10;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        sensor = 1'b1;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        green_cnt = 0;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        yellow_cnt = 0;

    end

endmodule

  1. 2014年08月10日 08:56 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた4(data_types_example3)

今回は、”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”の data_types_example3.zip をやってみようと思う。

Vivado 2014.2 を立ち上げて data_t_ex3 プロジェクトを作成した。使用するボードを ZedBoard に設定した。今回のデータ型のサンプルはステートマシンだ。

インプリメントを行い成功した。
SystemVerilog_19_140810.png

どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_20_140810.png

うん。常識的なステートマシンの実装のようだ。

実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_21_140810.png

テストベンチ traffic_light_tb.sv を作成して、Vivado Simulator でシミュレーションを行った。今回はシミュレーションを行うことができた。
SystemVerilog_22_140810.png

ステートマシンのステートの表示が値ではなく、定義した名前で表示されていて、とっても見やすい。VHDLと同じになった。とても良いと思う。

最後に、テストベンチ traffic_light_tb.sv を貼っておく。

`timescale 1ns / 1ps

module traffic_light_tb;
    parameter DELAY    = 5;

    logic           sensor;
    logic [15:0]    green_cnt;
    logic [15:0]    yellow_cnt;
    logic           clk;
    logic           rst;
    logic           green_light;
    logic           yellow_light;
    logic           red_light;

    traffic_light traffic_light_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

    initial begin
        rst = 1'b1;
        #20 rst = 1'b0;
    end

    initial begin
        sensor = 1'b0;
        green_cnt = 5;
        yellow_cnt = 10;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;
        sensor = 1'b1;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        green_cnt = 0;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        yellow_cnt = 0;

    end

endmodule


  1. 2014年08月10日 05:09 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた3(data_types_example2)

今回は、”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”の data_types_example2.zip をやってみようと思う。

Vivado 2014.2 を立ち上げてプロジェクトを作成した。最初は、ZedBoardのプロジェクトを作成したが、IOピンが足りなかったので、Kintex-7 の xc7k160tfbg676-1 に変更した。

これでインプリメントが成功した。下に、IOポートの様子を示す。
SystemVerilog_14_140809.png

shortreal 型の real_out は 64ビット幅だ。realtime 型の time_out も同様に 64ビット幅だ。

どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_15_140809.png

a 入力だけに加算器とレジスタがあって、他は固定出力だった。

実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_16_140809.png

縦に長い回路になっている。下の方は固定値のIOピンのようだ。
上の方を拡大してみた。
SystemVerilog_17_140809.png

a 入力あたりだ。

論理シミュレーションを行ったところ、エラーだった。System Verilog real type portはサポートされていないそうだ。

ERROR: [XSIM 43-3190] File "C:/Users/ono/Documents/HDL/Vivado/SV_Examples/data_t_ex2/data_t_ex2.srcs/sources_1/imports/data_types_example2/real_type_example.sv" Line 31 : The "System Verilog real type port" is not supported yet for simulation.


SystemVerilog_18_140809.png

ModelSim ASE 10.1d でシミュレーションを行ったところ、問題なく成功した。
SystemVerilog_19_140809.png

最後にテストベンチ real_type_example_tb.sv を下に貼っておく。

`timescale 1ns / 1ps

module real_type_example_tb;
    parameter DELAY    = 5;

    logic clk;
    int a;
    shortreal real_out;
    realtime time_out;
    longint b;

    real_type_example real_type_example_i (.*);

    initial begin
        clk = 1'b0;
        forever begin
            clk = #10 ~clk;
        end
    end

   initial begin
        a = 5;

        @(posedge clk);    // 次のクロックへ
        #DELAY;
        @(posedge clk);    // 次のクロックへ
        #DELAY;

        a = 10;
        @(posedge clk);    // 次のクロックへ
        #DELAY;

    end

endmodule


  1. 2014年08月09日 05:46 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた2(data_types_example1)

Vivado 2104.2でSystemVerilog をやってみた1(data_types_example1)”をやってみると、Total On-Chip Power が 7.997W になっていて、大変なことになっていた。
SystemVerilog_6_140808.png

On-Chip にするとこんな感じ。I/OとDSPの消費電力が多い。
SystemVerilog_7_140808.png

どんな回路になっているか概略を見てみよう。まずは、Flow Navigator -> RTL Analysis -> Schematic をクリックした。
SystemVerilog_8_140808.png

ごく常識的な回路になっている。
次に、実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
SystemVerilog_9_140808.png

左右真ん中、上下で上の方の大きな2つの四角を拡大してみよう
SystemVerilog_10_140808.png

DSP48E1が使われているのがわかる。

パワーを食い過ぎているのは、クロックのタイミング制約が無い為と思われるので、クロックのタイミング制約を追加する。

タイミング制約を生成してみよう。Flow Navigator -> Implementation -> Edit Timing Constraints を選択した。

clock信号のPERIOD制約を生成する。
SystemVerilog_11_140808.png

制約をXDCファイルとしてセーブした所。
SystemVerilog_12_140808.png

もう一度インプリメントを行うと、Total On-Chip Power は 0.148Wとなった。良かった。
SystemVerilog_13_140808.png

やはり、PERIOD制約をかけないと、Total On-Chip Power の計算がまずくなるようだ。
  1. 2014年08月08日 17:06 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0

Vivado 2104.2でSystemVerilog をやってみた1(data_types_example1)

仙台からブログを書きます。

Vivado 2014.2 でSystemVerilog がサポートされているので、確かめてみることにした。

Vivado 2014.2 のSystemVerilog サポートの情報は、”AR# 51360 Vivado 合成のデザイン アシスタント - SystemVerilog のサポート”に色々と情報があり、その下に行くとサンプルコードもある。
その内の最初の”AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート”がある。そこに4つのサンプルデータがある。それは、data_types_example1.zip、data_types_example2.zip, data_types_example3.zip, data_types_example4.zip だ。
最初の data_types_example1.zip を解凍すると、ALU.sv、definitions.sv、data_type_example1_readme.txt が入っていた。このサンプルはALUの動作を表すサンプルコードとなっている。
SystemVerilog_1_140808.png

その内の ALU.sv、definitions.sv を使用して、Vivado 2014.2 で data_t_ex1 プロジェクトを作成した。
試してに論理合成、インプリメントをしてみたが、クリティカル・ワーニングは出たが、正常に行うことが出来た。(プロジェクトは、ZedBoardのプロジェクトです)
SystemVerilog_2_140808.png

ALU の入出力ポートの記述引用する。


`include "definitions.sv"
import definitions::*;
module ALU(
input instruction_t IW,
input logic clock,
output logic [31:0] result
);


IWの宣言は、以下の通り。これも引用する。


typedef struct{
logic [31:0] a, b;
opcodes_t opcode;
} instruction_t;


これらの入出力ポートがどのようにインスタンスされているかを見ると、以下の図の通りになった。
SystemVerilog_3_140808.png

IWは、IW[a], IW[b], IW[opcode] の3つのポートから構成されている。ちゃんと実装されているようだ。

次にテストベンチを作成して、Behavioral Simulation を実行したが、下のエラーが出て、どうしてもシミュレーションすることができない。
SystemVerilog_4_140808.png

ERROR: [VRFC 10-2063] Module <ALU> not found while processing module instance <ALU_i> [C:/Users/ono/Documents/HDL/Vivado/SV_Examples/data_t_ex1/data_t_ex1.srcs/sim_1/new/ALU_tb.sv:33]
ERROR: [XSIM 43-3322] Static elaboration of top level Verilog design unit(s) in library work failed.


現在もこのエラーが原因でシミュレーションを行うことができない。下にテストベンチ (ALU_tb.sv) を貼っておくので、なにかお気づきの点がありましたら、コメント欄でお知らせください。よろしくお願いします。
`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2014/08/07 08:18:52
// Design Name: 
// Module Name: ALU_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////

`timescale 1ns / 1ps

`include "definitions.sv"
import definitions::*;
module ALU_tb;
    parameter DELAY    = 5;
    
    instruction_t     IW;
    logic             clock; 
    logic [31:0]    result;

    ALU ALU_i (
//        .IW(IW),
//        .clock(clock),
//        .result(result)
        .*
     );
    
    initial begin
        clock = 1'b0;
        forever begin
            clock = #10 ~clock;
        end 
    end
    
    initial begin
        IW.a = 5;
        IW.b = 2;
        IW.opcode = ADD;
        
        @(posedge clock);    // 次のクロックへ
        #DELAY;
        @(posedge clock);    // 次のクロックへ
        #DELAY;
        
        IW.opcode = SUB;
        @(posedge clock);    // 次のクロックへ
        #DELAY;

        IW.opcode = MUL;
    end    
endmodule


(追加)
ModelSim ASE 10.1d でやってみました。
run 1us コマンドを実行した所、問題なくシミュレーションすることが出来ました。
SystemVerilog_5_140808.png

Vivado 2014.2 のSimulator は SystemVerilog をシミュレーションする用途には、使わない方が良さそうですね。。。
  1. 2014年08月08日 05:11 |
  2. SystemVerilog
  3. | トラックバック:0
  4. | コメント:0
»