Virtex5のRAMB36が動かない

一昨日data2memが成功したのは良いが、なぜかMico32命令用RAMB36が動かない。
単なる2portRAMだから、以下の設定でやってるが、なんかミスってるかな?

RAMB36 #( .WRITE_MODE_A("WRITE_FIRST")
, .WRITE_MODE_B("WRITE_FIRST")
, .WRITE_WIDTH_A(36)
// , .WRITE_WIDTH_B(36)
, .READ_WIDTH_A (36)
// , .READ_WIDTH_B (36)
, .DOA_REG (1)
, .DOB_REG (1)
) RAMB36_0 ( .CASCADEOUTLATA( ) // no use
, .CASCADEOUTLATB( ) // no use
, .CASCADEOUTREGA( ) // no use
, .CASCADEOUTREGB( ) // no use
, .DOA (data_out )
, .DOB ( ) // no use
, .DOPA ( ) // no use
, .DOPB ( ) // no use
, .ADDRA ({5'h00, addr})
, .ADDRB ({16{1'b0}} ) // no use
, .CASCADEINLATA (1'b0 ) // no use
, .CASCADEINLATB (1'b0 ) // no use
, .CASCADEINREGA (1'b0 ) // no use
, .CASCADEINREGB (1'b0 ) // no use
, .CLKA (clk )
, .CLKB (clk ) // no use
, .DIA (data_in )
, .DIB ({32{1'b0}} ) // no use
, .DIPA ({ 4{1'b0}} ) // no use
, .DIPB ({ 4{1'b0}} ) // no use
, .ENA (1'b1 )
, .ENB (1'b1 ) // no use
, .REGCEA (1'b1 ) // no use
, .REGCEB (1'b1 ) // no use
, .SSRA (1'b0 ) // not reset
, .SSRB (1'b0 ) // not reset
, .WEA ({ 4{we }} ) // no use
, .WEB ({ 4{1'b0}} ) // no use
);

Sim時の確認事項として以下。

  ・glbl.vはコンパイルしていてGSRが1→0になるのを待ってから動作させてるので、
   スタートアップ時の待ち時間が無い訳ではない。
  ・Mico32の命令用SRAMなので、A側の1portだけを使い、かつROMとして使う。
    → 上記ではweを入力しているが上位モジュールで0固定。
       data_inも同様に未使用。
  ・出力段FFは使わなくても良いのだが、とりあえず、動かしておけば値が出てくるのが
   見れると思ってDOA_REG=1でparameter設定。
  ・テストベンチとしては、clk入力して、addrを変化させれば、それに合わせて出力data_out
   から値が出てくるものとして作成している。

単に、2portSRAMをROMとして使うだけなんだが、なぜ動かない?なんか見落としてる??
スポンサーサイト

data2memでMico32のプログラムを書き換えたい(3)

今日ついさっきやったMico32データ用プログラムのdata2mem成功に続き、命令用も成功。
参考にやった事を書いておく。(データ用でも同じ事やるんだけど、なんとなく情報追加)

○RAMB36の初期値Verilogファイル(命令用)
defparam RAMB36_0.INIT_00 = 256'h00000000000000000000000000000000000000000000000000000000e0000040;
defparam RAMB36_0.INIT_01 = 256'h00000000000000000000000000000000000000000000000000000000e000006d;
defparam RAMB36_0.INIT_02 = 256'h00000000000000000000000000000000000000000000000000000000e0000061;
defparam RAMB36_0.INIT_03 = 256'h00000000000000000000000000000000000000000000000000000000e0000059;
defparam RAMB36_0.INIT_04 = 256'h00000000000000000000000000000000000000000000000000000000e0000051;
defparam RAMB36_0.INIT_05 = 256'h00000000000000000000000000000000000000000000000000000000e0000049;
defparam RAMB36_0.INIT_06 = 256'h00000000000000000000000000000000000000000000000000000000e0000041;
defparam RAMB36_0.INIT_07 = 256'h00000000000000000000000000000000000000000000000000000000e0000039;
defparam RAMB36_0.INIT_08 = 256'h5b8400105b83000c5b8200085b810004379cffc8e00001413b9c1ffc781c2000;
      :

○上記RAMB36初期値Verilogファイルからmemファイルへ変換(Rubyで記述)
#----------------------------------------------------------------------
# file : conv_ver2mem_ramb36_v100.rb
# func : change verilog initial memory map to mem description for data2mem.
# cmd : ruby conv_ver2mem_ramb36_v100.rb
#----------------------------------------------------------------------

ram_ini = ARGV
ofile_name = ram_ini.to_s + ".mem"

ifile = File::open(ram_ini.to_s, "r")
ofile = File::open(ofile_name, "w")

ofile.print "@0\n"

ifile.each do |line|
temp_a = line.split(/.* 256.h|;\n/)
$dat = temp_a[1]

while $dat.size > 0
# 文字列一番左=0、一番右=-1。 → -8~-1まで=右端の8文字分の意味。
ofile.print $dat.slice!(-8..-1), "\n"
end
end

ifile.close
ofile.close

○上記Rubyで生成したmemファイル
@0
e0000040
00000000
00000000
00000000
00000000
00000000
00000000
00000000
e000006d
00000000
  :

○命令用bmm
ADDRESS_SPACE mico32inst RAMB32 INDEX_ADDRESSING [0x00000000:0x000003ff]
BUS_BLOCK
mico32_vga_1/mico32/inst_rom32_core/RAMB36_0 [31:0] PLACED=X0Y5;
END_BUS_BLOCK;
END_ADDRESS_SPACE;

コマンドなんかはさっきと同じで、命令用の方も成功。なんか良くわからんうちに成功したって感じ。
こんな感じの実験、過去もやったような記憶あるけど、その時はなんか混乱してたのかな。
でも実は、data2mem自体は成功したようだが、このRAMB36では実機で動いてません。
RAMB16_S9からRAMB36へ手修正で回路直した時、なんかバグがあるみたい。
これからVerilogシミュレーションせねば。

data2memでMico32のプログラムを書き換えたい(2)

bitファイル内のMico32プログラム(BRAMの初期値)をdata2memで書き換えてみる実験中。

■データ用プログラムの書き換えに成功?
○ucf
INST "mico32_vga_1/mico32/data_ram32_core/RAMB36_0" LOC = "RAMB36_X0Y6" ;

○bmm
ADDRESS_SPACE mico32inst RAMB32 INDEX_ADDRESSING [0x00000000:0x000003ff]
BUS_BLOCK
mico32_vga_1/mico32/data_ram32_core/RAMB36_0 [31:0] PLACED=X0Y6;
END_BUS_BLOCK;
END_ADDRESS_SPACE;

○mem
  ※ ほんとはRAMB36のメモリ全て埋め尽くす分のmemファイルにすべきだが、
    自分が書いたCコンパイルの結果、データ用に格納される値はこれだけ。
    これ以降は全て0が初期値。
    data2memでは指定しないアドレスは0で埋め尽くすらしいので、下記
    結果検証の通り不一致無しになった。

@00000000
59455300
00000000
00000001

○コマンド
data2mem -i -bm mico32_vga.inst0.bmm -bd data_ram_data.v.inst0.mem -bt fpga_top_ramb36.bit -p xc5vlx50 -o b fpga_top_ramb36_data.bit

○結果検証
zdiff fpga_top_ramb36_data.bit fpga_top_ramb36.bit

○考察
ん?なんだか、出来たっぽいぞ。Cygwinでzdiff不一致無しとの結果が。
ちなみにmemファイルの番地指定(@の行)はdata2memユーザガイドとか見た時は、
CPUのメモリマップという理解でいたのだが、「@0」で成功してるって事は理解が違うのかな?
まあ、深い事は気にせず次に行こう。
(気にするべきだと思うが)面倒な事はせず楽しくやるのが優先だ。

  ※ ちなみに、値がたくさん入ってる命令用プログラムの方を先に同じ事やって不一致多発。
     バイナリエディタStirlingで比較機能使って見たら、不一致多過ぎて萎えた。
     データ用で初めて、zdiffがPassしてうれしい。

data2memでMico32のプログラムを書き換えたい

上手くいってない、XilinxのISE保有コマンドdata2memを使って、何とかMico32コアの命令&データ
のプログラム初期値を書き換えたい。書き換えたいんです。
これが出来れば、毎回30分ほどかかるコンパイル時間を数秒にする事が出来る。

DMW2005/4「データ・バッファやCPUコアに不可欠なメモリを使いこなす」の最後のページを見てて
ふと思ったんだけどもしやbmmやmemファイルで指定すべき「アドレス」って単なるBRAMのアドレス
のこと??
CPUメモリマップのアドレス(命令:0x00000000、データ:0x2000000 → そもそもこれが間違い?)
かと思ってたんだが。。。

 ※ ほんとはここにpdfの記述を貼り付けたいんだが、なぜかコピーできず。

data2memが対応してないのか?と思って、RAMB16_S9をRAMB36に置き換えて動作確認してた
ところ。置き換え後、DWM付属の吉田工作さん(たしかこの方)のプログラムでVerilog初期値を
作って、その後、入れたいBRAMタイプ毎にRubyで整形して、ってやってました。
こんな努力は必要ないのかな?もう一度RAMB16_S9で試してみようかな。

どなたかMico32で成功してる方いらっしゃらないかな?情報頂けると泣くほど嬉しいです。
というかこのブログ昨日開設したので、そもそも見てる方がいないか・・・

唯一やってた方を発見したのは以下の方のでしたが、読むと途中から何をすれば良いのか良く
分からなくなってしまう。

Spartan3E Starter KitでuCLinux 2
http://www.marv.mediatti.net/~molelord/5370617274616E33452053746172746572204B6974A4C775434C696E75782032.html

ほんとはML501ボードでもっと遊びたいですが、data2memが上手くいかずいらいらしてNEEK
に浮気をすることに。どちらも楽しいボードですが。

ザイリンクスML501評価ボードでやったこと

◆LatticeMico32
デザインウェーブ?号の特集見て搭載したい欲望爆発。
付属のMico32ソースをISEでコンパイルするとエラー。
「コーヒーでも飲んで検証の話でも」さんのHP見ながらエラー回避。
でもそもそも本の特集はSpartan3用ソースだったが、ML501はVirtex-5。どういった経緯か忘れたが、BRAM 16bitを9bitタイプに
変更(したような)。
その後、data2memでソフト更新したい欲望沸き、いろいろ試すが、どうも命令とデータのアドレスマップが違うためか、上手く行かない。

ADDRESS_SPACE mico32inst RAMB16 INDEX_ADDRESSING [0x00000000:0x00001fff]
BUS_BLOCK
mico32_vga_1/mico32/inst_rom32_core/RAMB16_S9_0 [7:0] PLACED=X0Y5;
mico32_vga_1/mico32/inst_rom32_core/RAMB16_S9_1 [15:8] PLACED=X0Y6;
mico32_vga_1/mico32/inst_rom32_core/RAMB16_S9_2 [23:16] PLACED=X0Y7;
mico32_vga_1/mico32/inst_rom32_core/RAMB16_S9_3 [31:24] PLACED=X0Y8;
END_BUS_BLOCK;
END_ADDRESS_SPACE;

こんなふうに命令用bmmは作ったんだが、同じように作ったデータの方ではエラー。メモリマップの認識が違うのか??

◆DDR2 SDRAMメモリ
自作コントローラでアクセス成功。しかし、READ用キャリブレーション回路に問題あるらしく、画像がちらつく。

◆Crontel CH7301 DVIトランスミッター
LatticeMico32からソフトでレジスタ設定し画面出力に成功。I2CマスターはOpenCoreからパクっと。

◆キャラクタLCD
LCDC作るが、動作してない。PCモニタI/FはCH7301の方で既に出来てるからいっか。

◆Cypress CY7C67300 USBコントローラ
USB経由で高速コンテンツ転送したいが。 TD読んでるがよくわからん。

◆SYSACE(CFからFPGAコンフィグ)
CFへFPGAコンフィグデータWriteすれば、FPGAはCFから起動出来た。便利。

◆SYSACE(CFコントローラ)
CFを外部メモリとして使うため、SYSACEからのアクセス方法調べ。MPU I/Fを使ってアクセス
すればOKと認識。VerilogでI/F回路を書くがうんともすんとも。
カレンダー
06 | 2018/07 | 08
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード