4.1.3 SRAM

Altera のSRAMをシミュレーションしてみます。H8プロジェクトでは、AlteraのSRAMの特性を生かした設計したいと思っています。筆者もAlteraのSRAMを使いこなしているわけではないので、ここでシミュレーションしながら、使い方を確認しておきたいと思います。

4.1.3.1 Quartus MegaWizard
Wizardに従ってSRAMブロックを作成していきましょう。仕様は

ここで、3ポートを選んだ理由は、H8プロジェクトで使用を予定しているからです。

Quartus上で Tools=>MegaWizard...を選択して、上記仕様を選択していき下図のようになります。

図を見ればお分かりの通り、入力は、全てFFで受けて、出力もFFになっています。2クロック遅れで指定のAddressのDataが出力されます。OPTIONで出力FFなしにすることはできますが、入力のFFは削除できない仕様になっています。

4.1.3.2 RTL シミュレーション

それでは、合成対象ソースです。ram8x256_3port は、Wizardで作成した3ポートRAMです。

module h8_ram(data,wraddress,rdaddress_a,rdaddress_b,wren,clock,qa,qb);
        parameter modules=1;
        parameter width=8;
        input [modules*width-1:0] data;
        input [7:0] wraddress;
        input [7:0] rdaddress_a;
        input [7:0] rdaddress_b;
        input wren;
        input clock;
        output [modules*width-1:0] qa;
        output [modules*width-1:0] qb;


        

        ram8x256_3port u1(.data(data),.wraddress(wraddress),.rdaddress_a(rdaddress_a),
        .rdaddress_b(rdaddress_b),.wren(wren),.clock(clock),.qa(qa),.qb(qb));

endmodule

テストベンチソースです。RAMAddress値をDataとしてインクリメンタルに書きます。
その後、一回読み出して終わりです。

`timescale 1ns/1ps
module ram_test;
        reg [7:0] data=0;
        reg [7:0] wraddress,rdaddress_a,rdaddress_b;
        reg wren=0;
        reg clock=0;
        wire [7:0] qa,qb;
        integer i;
        always #10 clock=~clock;

        initial begin
                #5;
                for (i=0; i <=256;i=i+1) begin  
                        @(negedge clock);
                                wraddress=i;
                                wren=1;
                                data=i;
                end
                @(negedge clock);
                wren=0;
                for (i=0; i <=256;i=i+1) begin  
                        @(negedge clock);
                                rdaddress_a=i;
                                rdaddress_b=256-i;
                                data=i;
                end
                #10;
                $finish;
        end

        h8_ram u1(.data(data),.wraddress(wraddress),.rdaddress_a(rdaddress_a),
        .rdaddress_b(rdaddress_b),.wren(wren),.clock(clock),.qa(qa),.qb(qb));

endmodule

RTLプロジェクトは、以下の通りとします。ここで、altera_mf.v は、メガファンクションのRTLライブラリになっています。quartas\eda\sim_lib\下にあります。

WaveformViewerで波形を確認したら、論理合成します。
例によって、simulation\custom下に合成後のゲートソースが出力されます。

4.1.3.3 ポストレイアウト遅延ゲートシミュレーション

遅延シミュレーション用のプロジェクトを作成します。
ゲートのライブラリは、cyclone_atoms.v です。これもquartas\eda\sim_lib\下にあります。
h8_ram.vo が論理合成で生成されたファイルです。プロジェクトは、このフォルダに作成しなければなりません。

上の波形はWrite時、下の波形がRead時です。

Read時、アドレスが読み込まれて(黒カーソル)、赤カーソルの位置から、出力され始めますが、出力遅延分遅れる様子が分かると思います。この出力が利用可能なのは次のPOSエッジなので、結局2クロック遅れてしまうことになります。