2022-01-14 bram_copy_tb.vを実装 >Run Simulationにおいて CTRLのL->H動作時にcounterが0クリアされない
動作環境
- Windows 10 Pro
- Vivado v2019.1
- CORA Z7 (Z7-07S)
概要
PYNQ を使って Python で手軽に FPGA を活用 (5)にあるbram_copy.v
に対するテストベンチを実装した。
Run SimulationにてCTRLピンを「L->H」した時にBRAM間転送用のcounterが0クリアされない。
Note: XSDKの実装ではCTRLピンを「L->H」した時にcounterが0クリアされて、BRAM間転送が実施される。
Run Simulation用テストベンチの実装ミスだろうか?
内容
テストベンチ
2021-12-27 「PYNQ を使って Python で手軽に FPGA を活用 (5)」をXSDK実装
にて使用したbram_copy.vに対してテストベンチを以下のように実装した。
`timescale 1ns / 1ps
module bram_copy_tb(
);
localparam STEP = 8;
localparam CLKNUM = 800;
// for input
reg RSTN;
reg CLK;
reg [31:0] Q0;
reg [31:0] Q1;
reg CTRL;
// for outpuot
wire clk0;
wire rst0;
wire en0;
wire [31:0] addr0;
wire [31:0] data0;
wire [3:0] we0;
wire clk1;
wire rst1;
wire en1;
wire [31:0] addr1;
wire [31:0] data1;
wire [3:0] we1;
wire [31:0] status;
// bram_copyを接続
bram_copy bram_copy(
.clk(CLK),
.resetn(RSTN),
.clk_0(clk0),
.rst_0(rst0),
.en_0(en0),
.addr_0(addr0),
.data_0(data0),
.we_0(we0),
.q_0(Q0),
.clk_1(clk1),
.rst_1(rst1),
.en_1(en1),
.addr_1(addr1),
.data_1(data1),
.we_1(we1),
.q_1(Q1),
.ctrl(CTRL),
.status(status)
);
always begin
CLK = 0; #(STEP/2);
CLK = 1; #(STEP/2);
end
initial begin
// 初期化
CTRL = 0;
Q0 = 32'hDEADBEEF;
Q1 = 32'hDEADBEEF;
RSTN = 1;
#(STEP*20) RSTN = 0;
#(STEP*20) RSTN = 1;
//
#(STEP*132) CTRL=1; // 128CLK以上待つ
#(STEP*10) CTRL=0;
#(STEP*132) CTRL=1; // 128CLK以上待つ
#(STEP*10) CTRL=0;
//
// CLK処理
#(STEP*CLKNUM);
$stop;
end
endmodule
Run Simulation
上記とbram_copy.vを用いてRun Simulationした結果が以下の通り。

CTRLピンが二回「L->H」に変化していることがわかる (以下、rising edgeと表記)。
status[31:0]
はbram_copy.vにおいてstatus <= counter;
としてcounter値が入っている。
リセット直後はstatus値が0から128までインクリメントされていく様子が見られる(正常)。
CTRLピンのrising edge近辺の波形が以下の通り。

CTRLピンのrising edge後にstatus(counter)の値が0にならない。このため、二回目のBRAM間転送が実施されない。
bram_copy.vの実装
bram_copy.vの注目している実装部分は以下の通り。
if(ctrl_reg == 0 && ctrl != 0) begin
counter <= 0;
end
納得いかない点
2021-12-27 「PYNQ を使って Python で手軽に FPGA を活用 (5)」をXSDK実装
にて実装したXSDKの処理においてCTRLのrising edgeを二回発生させたが、BRAM間転送は二回とも実施された(正常)。
XSDKの処理としては正常であり、bram_copy.vの実装自体に問題はないようである。
一方で、Run Simulationした時の波形が期待どおりでない(counterがゼロクリアされない)。
自分のテストベンチ実装の間違いなのだろうか?