FC2ブログ

[Verilog]メモリ初期値.mifから.ver生成される

アルテラへLattice Mico32インプリ中。

mico32の命令メモリにaltsyncramを呼び出して使っている。
初期値ファイルとして、ソフトコンパイル後の.mifを読み込ませる。
下の「.init_file = ""」のとこで読んでる。
altsyncramの資料見ると、読めるのは、.mifと.hexのみとのこと。

DESIGN WAVE MAGAZINE 2007年10月号の付録に、山際伸一さんが作った
プログラムmemcvtを使うと、ビルド後の.srecから、.v、.mif、.hexを生成してくれる。
有難い。

そんな訳で生成した.mifをaltsyncramへ読み込ませているが、ModelSimでSimすると、
.verファイルについて指摘された。
.verなんて作ってないぞ!と思ったら、これはModelSimが自動的に生成するのね。
そんな認識なかったので、とりあえずメモ。
これはModelSimだからなのか、Verilogで規定されてるのか不明だったので、
とりあえずVerilogカテゴリで記事書いた。

altsyncram ram_0 (
.address_a (AddressA )
, .clock0 (ClockA )
, .data_a (DataInA[7:0] )
, .wren_a (WrA )
, .q_a (QA[7:0] )
, .rden_a (1'b1)
, .rden_b (1'b1)
, .address_b (AddressB )
, .clock1 (1'b1 )
, .data_b (DataInB[7:0] )
, .wren_b (WrB )
, .q_b (QB[7:0] )
, .addressstall_a (1'b0 )
, .addressstall_b (1'b0 )
, .byteena_a (1'b1)
, .byteena_b (1'b1)
, .clocken0 (1'b1 )
, .clocken1 (1'b1 )
, .clocken2 (1'b1)
, .clocken3 (1'b1)
, .eccstatus ()
, .aclr0 ()
, .aclr1 ()
);
defparam
ram_0.clock_enable_input_a = "BYPASS",
ram_0.clock_enable_output_a = "BYPASS",
ram_0.init_file = "../../../../vm_share/lm32/soft/inst_ram_data.hex",
ram_0.intended_device_family = "Cyclone III",
ram_0.lpm_hint = "ENABLE_RUNTIME_MOD=NO",
ram_0.lpm_type = "altsyncram",
ram_0.maximum_depth = 512,
ram_0.numwords_a = 512,
ram_0.operation_mode = "SINGLE_PORT",
ram_0.outdata_aclr_a = "NONE",
ram_0.outdata_reg_a = "CLOCK0",
ram_0.power_up_uninitialized = "FALSE",
ram_0.ram_block_type = "M9K",
ram_0.read_during_write_mode_port_a = "NEW_DATA_NO_NBE_READ",
ram_0.widthad_a = 9,
ram_0.widthad_b = 9,
ram_0.width_a = 8,
ram_0.width_b = 8,
ram_0.width_byteena_a = 1,
ram_0.width_byteena_b = 1;

スポンサーサイト

[Verilog]下位moduleのparameterを上位から指定

http://ameblo.jp/middleisland88/entry-11424595927.html

例1: add #(4,4,4) u1(.clk(clk),.a(a),.b(b),.c(c));


例2: add #(.width_c(4),.width_a(4),.width_b(4) )
add_u(.clk(clk),.a(a),.b(b),.c(c));


例3) ポート宣言でパラメータを用いる場合にも#を使用出来る
//****************************************************
module add #(parameter width_a = 8 ,parameter width_b = 8, parameter width_c = 8)
(
input clk,
input [width_a-1:0] a,
input [width_b-1:0] b,
output reg [width_c:0] c
);


例4)defparamとインスタンス名を使用して
下位モジュールのパラメータを宣言も可能
//****************************************************
module add_4
(
input clk,
input [3:0] a,
input [3:0] b,
output [4:0] c
);
defparam u1.width_a = 4;
defparam u1.width_b = 4 ,u1.width_c = 4;

add u1(.clk(clk),.a(a),.b(b),.c(c));

Verilog記述ビット幅異なる演算時のバグ例

菅原さんのVeritakの「Verilog HDL高度なF.A.Q.」を見てて、勉強になった。

参照先: http://japanese.sugawara-systems.com/user_note/professional_FAQ.htm#R11

■バグ例
 ○バグ出る記述
     reg [3:0] wp, rp;
     assign fifo_full = (rp-1==wp) ? 1'b1: 1'b0;

   上記では、rp=4'h0、wp=4'hFの時にfifo_fullが1にならない。

 ○解説
   rp-4'b0001にすればOK。
   これもビット幅の問題であり、"1"は32ビット以上の整数。
   なので、==の評価時は、両辺同じ32ビット幅に拡張される。

   fifo_full演算の左側(rp-1)=32'hffff_ffff、右側(wp)=32'h0000_000f
   となってしまい、同値にならない。よって、IF文がFalseになる。
   特に演算系では、ビット幅は一致させた方が良い。

前に同じ事を調べたが、すっかり忘れて最近自作したFIFOもこのバグ発生する気が・・・
カレンダー
08 | 2018/09 | 10
- - - - - - 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 - - - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

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

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

この人とブロともになる

QRコード
QRコード