今回は、”
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 を行った。表示された波形を下に示す。
0番地には 12 が Write できて、Read もできている。(点線のカーソル部分) 8番地は、34 を Write して、Read 時に xx となっている。(実線のカーソル部分)
次に、Post-Synthesis Simulation を行った。表示された波形を下に示す。
0番地に 12 を Write したはずが、Read では00 が読めた。(点線のカーソル部分) 8番地は、34 を Write して、Read 時に 34 を Read できている。(実線のカーソル部分)
Behavioral Simulation と Post-Synthesis Simulation の結果が全く違う。どうしたことだろう?
次に、Post-Implemantaion Simulation を行った。表示された波形を下に示す。
Post-Synthesis Simulation の結果と同様な結果が得られた。
次に、パック型配列サンプル (aggregate_data_types_example2.zip) のシミュレーションを行った。
最初に、Behavioral Simulation を行った。表示された波形を下に示す。
アンパック型配列の Behavioral Simulation と同様の波形だった。
次に、、Post-Synthesis Simulation を行った。表示された波形を下に示す。
0番地に 12 を Write して、Read した結果も、8番地に 34 を Write して Read した結果も、00 となった。
次に、Post-Implemantaion Simulation を行った。表示された波形を下に示す。
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 の結果が違ってしまった。これはなぜだろう?論理合成結果は正しいのだろうか?
2014年08月13日 04:14 |
SystemVerilog
| トラックバック:0
| コメント:0
今回は、”
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 を表示してみる。
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個のメモリセルをインスタンスできていると思われる。 アンパック型配列とパック型配列の違いは、実際にはこの辺りの違いが大きいのではないか?と思う。 (2014/08/12:追記)
アンパック型配列とパック型配列では、同じく8個のメモリがインスタンスされていた。
パック型配列では、8ビットのアドレスが残っていたが、アドレスは1つずつ8ビット単位のメモリ素子のイネーブルに接続されているようだった。
アンパック型配列では、8個のメモリ素子に接続されている。
アンパック型配列は普通のメモリになっているが、パック型配列はこれでよいのだろうか?
2014年08月12日 14:10 |
SystemVerilog
| トラックバック:0
| コメント:0
今回は、”
AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート ”の data_types_example4.zip をやってみようと思う。
Vivado 2014.2 を立ち上げて data_t_ex4 プロジェクトを作成した。使用するボードを ZedBoard に設定した。今回のデータ型のサンプルはtype operator だ。下位モジュールのパラメータでポートのデータ・タイプを変更することができるようだ。
インプリメントを行い成功した。
どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
インプリメントするとDelay はなくなってしまうので、2つの adder が並んでいる。
実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
これだとよくわからないので、中央部分を拡大した。
入力から、IBUFを通して、adder に接続され、adder からOBUF を通して出力しているのがわかる。
テストベンチ (top_tb.sv) を作成して、Vivado Simulator でシミュレーションを行った。
今回も前回同様に、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
2014年08月10日 08:56 |
SystemVerilog
| トラックバック:0
| コメント:0
今回は、”
AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート ”の data_types_example3.zip をやってみようと思う。
Vivado 2014.2 を立ち上げて data_t_ex3 プロジェクトを作成した。使用するボードを ZedBoard に設定した。今回のデータ型のサンプルはステートマシンだ。
インプリメントを行い成功した。
どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
うん。常識的なステートマシンの実装のようだ。
実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
テストベンチ traffic_light_tb.sv を作成して、Vivado Simulator でシミュレーションを行った。今回はシミュレーションを行うことができた。
ステートマシンのステートの表示が値ではなく、定義した名前で表示されていて、とっても見やすい。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
2014年08月10日 05:09 |
SystemVerilog
| トラックバック:0
| コメント:0
今回は、”
AR# 51327 Vivado 合成のデザイン アシスタント - SystemVerilog データ型のサポート ”の data_types_example2.zip をやってみようと思う。
Vivado 2014.2 を立ち上げてプロジェクトを作成した。最初は、ZedBoardのプロジェクトを作成したが、IOピンが足りなかったので、Kintex-7 の xc7k160tfbg676-1 に変更した。
これでインプリメントが成功した。下に、IOポートの様子を示す。
shortreal 型の real_out は 64ビット幅だ。realtime 型の time_out も同様に 64ビット幅だ。
どんな回路になっているか概略を見てみよう。Flow Navigator -> RTL Analysis -> Schematic をクリックした。
a 入力だけに加算器とレジスタがあって、他は固定出力だった。
実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
縦に長い回路になっている。下の方は固定値のIOピンのようだ。
上の方を拡大してみた。
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.
ModelSim ASE 10.1d でシミュレーションを行ったところ、問題なく成功した。
最後にテストベンチ 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
2014年08月09日 05:46 |
SystemVerilog
| トラックバック:0
| コメント:0
”
Vivado 2104.2でSystemVerilog をやってみた1(data_types_example1) ”をやってみると、Total On-Chip Power が 7.997W になっていて、大変なことになっていた。
On-Chip にするとこんな感じ。I/OとDSPの消費電力が多い。
どんな回路になっているか概略を見てみよう。まずは、Flow Navigator -> RTL Analysis -> Schematic をクリックした。
ごく常識的な回路になっている。
次に、実際のマッピングを見るために、Flow Navigator -> Synthesis -> Schematic をクリックした。
左右真ん中、上下で上の方の大きな2つの四角を拡大してみよう
DSP48E1が使われているのがわかる。
パワーを食い過ぎているのは、クロックのタイミング制約が無い為と思われるので、クロックのタイミング制約を追加する。
タイミング制約を生成してみよう。Flow Navigator -> Implementation -> Edit Timing Constraints を選択した。
clock信号のPERIOD制約を生成する。
制約をXDCファイルとしてセーブした所。
もう一度インプリメントを行うと、Total On-Chip Power は 0.148Wとなった。良かった。
やはり、PERIOD制約をかけないと、Total On-Chip Power の計算がまずくなるようだ。
2014年08月08日 17:06 |
SystemVerilog
| トラックバック:0
| コメント:0
仙台からブログを書きます。
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の動作を表すサンプルコードとなっている。
その内の ALU.sv、definitions.sv を使用して、Vivado 2014.2 で data_t_ex1 プロジェクトを作成した。
試してに論理合成、インプリメントをしてみたが、クリティカル・ワーニングは出たが、正常に行うことが出来た。(プロジェクトは、ZedBoardのプロジェクトです)
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;
これらの入出力ポートがどのようにインスタンスされているかを見ると、以下の図の通りになった。
IWは、IW[a], IW[b], IW[opcode] の3つのポートから構成されている。ちゃんと実装されているようだ。
次にテストベンチを作成して、Behavioral Simulation を実行したが、下のエラーが出て、どうしてもシミュレーションすることができない。
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 コマンドを実行した所、問題なくシミュレーションすることが出来ました。
Vivado 2014.2 のSimulator は SystemVerilog をシミュレーションする用途には、使わない方が良さそうですね。。。
2014年08月08日 05:11 |
SystemVerilog
| トラックバック:0
| コメント:0