LoginSignup
1
0

More than 1 year has passed since last update.

2022-01-14 bram_copy_tb.vを実装 >Run Simulationにおいて CTRLのL->H動作時にcounterが0クリアされない

Posted at

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に対してテストベンチを以下のように実装した。

bram_copy_tb.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した結果が以下の通り。

image.png (34.3 kB)

CTRLピンが二回「L->H」に変化していることがわかる (以下、rising edgeと表記)。

status[31:0]はbram_copy.vにおいてstatus <= counter;としてcounter値が入っている。
リセット直後はstatus値が0から128までインクリメントされていく様子が見られる(正常)。

CTRLピンのrising edge近辺の波形が以下の通り。

image.png (50.1 kB)

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がゼロクリアされない)。

自分のテストベンチ実装の間違いなのだろうか?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0