Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーション4で下のように書いたら慣性遅延になって時間間隔が短い信号はなくなってしまった。
assign #DELAY_TIME ddr_dqs_sdram = (enable_o==1'b0) ? ddr_dqs_fpga : {DQS_BITS{1'bz}};
そこで、
このページを参考にさせていただいて、伝播遅延にするためにalways文、ノンブロッキング文で書いてみた。
`timescale 1ps / 1ps
parameter DELAY_TIME = 1500;
wire [DQS_BITS-1:0] ddr_dqs_fpga, ddr_dqs_sdram;
wire [DQ_BITS-1:0] ddr_dq_fpga, ddr_dq_sdram;
reg [DQS_BITS-1:0] ddr_dqs_fpgan, ddr_dqs_sdramn;
reg [DQ_BITS-1:0] ddr_dq_fpgan, ddr_dq_sdramn;
always @ *
if (enable_o == 1'b1)
ddr_dqs_fpgan <= #DELAY_TIME ddr_dqs_sdram;
else
ddr_dqs_fpgan <= #DELAY_TIME {DQS_BITS{1'bz}};
always @ *
if (enable_o == 1'b1)
ddr_dq_fpgan <= #DELAY_TIME ddr_dq_sdram;
else
ddr_dq_fpgan <= #DELAY_TIME {DQ_BITS{1'bz}};
always @ *
if (enable_o == 1'b0)
ddr_dqs_sdramn <= #DELAY_TIME ddr_dqs_fpga;
else
ddr_dqs_sdramn <= #DELAY_TIME {DQS_BITS{1'bz}};
always @ *
if (enable_o == 1'b0)
ddr_dq_sdramn <= #DELAY_TIME ddr_dq_fpga;
else
ddr_dq_sdramn <= #DELAY_TIME {DQ_BITS{1'bz}};
assign ddr_dqs_fpga = ddr_dqs_fpgan;
assign ddr_dq_fpga = ddr_dq_fpgan;
assign ddr_dqs_sdram = ddr_dqs_sdramn;
assign ddr_dq_sdram = ddr_dq_sdramn;
parameterの値はDQS_BITSは2で、DQ_BITSは16だ。
inoutの信号はregで宣言するとエラーになるのでregで宣言する信号は中間ノードとして、wireで宣言したinoutの信号にassignで代入している。
ModelSimの波形を下に示す。

上の図でddr_dqs_fpgaを1500ps遅延させてddr_dqs_sdramに入れていても、0-3-0と正常に遷移している。
もう少しバグを取ったらDDR SDRAMが正常に動作してREAD時のデータ出力までするようになった。でもdata_validが1の時に出力データが出ない。もう少しデバックが必要のようだ。
ともかくDDRが動作するようになってよかった。いろいろなWebサイトに助けられている。このブログも他の方の役に立てていれば良いと思った。
- 2007年01月30日 20:09 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0
昨日は
NPOグローバリスジャパン主催の
楽しいマイコン教室(親子で遊ぼうマイコンカー)に息子と行ってきた。
ラジコンカー(トミー・エアロアールシー)を改造してフリースケール社の
マイコンMC9S08QG8を載せてラジコンの代わりに8ビットマイコンで制御しようということだ。詳しくは
ここのサイトに載っている。
実際は
このようにラジコンカーを改造したのではなく、すでに改造してあった。10台分改造するのは大変だったろう。主催者の皆さんありがとうございました。
まずは改造済みラジコンカーを製作した。1台以前自分で作ったことがあったのだが、結構手間取って作り上げたのは一番最後になってしまった。何はともあれ出来上がってとりあえずはラジコンで動いた。
最初にはラジコンで動かすためDIPスイッチがショートピンの代わりに入っていたが、それを抜いてマイコンを挿入。左にステアリングを切って前進するという動作を2回行うC言語プログラムが入っている。(つまり2回左に回る)ツールはCodeWarriorだった。フリースケールから無償でもらっているそうだ。CodeWarriorはMACのころにCGIソフトを作ったことがある。OSF/Motifに次いで2回目に作ったGUIソフトだった。懐かしい!!!
それを8の字に走行すように変更した。2回目の左ステアリングを右に変更すれば8の字に曲がれるが、右左が不均等なので時間を変えて均等にしようとしたが、ある程度は出来るが正確には出来ない。おもちゃなのである程度は仕方がない。
次に8の字にもう1つ下に円を追加した形をトレースするという問題が出た。これは左ステアリング1周、右ステアリング半周で出来た。でもやはり不均等だ。まあこれで良いことにした。
感想はC言語を小中学生がやるには難しいだろうということだ。やはり
ロゴ、マインドストームのようにグラフィカルに動作を組み立てる方がいいじゃないかと思う。カーニハン・リッチーのC言語本も紹介していたが小・中学生が読めるとは思わない。暇になったらGUI作っちゃおうか? CodeWarriorってコマンドラインから使えるのかな?統合できると良いのだけど。
それにDIPスイッチとマイコンチップを交換するのが面倒なので、最初からマイコン乗せておいてラジコンのコマンドでラジコンとマイコン制御を切り替えたほうがいいじゃないだろうか?
でも、全体的には面白かった。うちの息子もラジコンカーを作るところは夢中でやっていた。プログラムのあたりは人を気にしていたが全般的には大丈夫だった。良かった。
最後にアンケートをろくに書かなくてごめんなさい。息子の様子が心配なこともあって書かないでしまった。帰りにいろいろお話をしたかったのだけど。。。
- 2007年01月29日 19:29 |
- 日記
-
| トラックバック:0
-
| コメント:0
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションも続けてやっている。
大体バグも取れてきたのだがModelSimXE3 starterだと1回シミュレーションするのに12分くらいかかる。バグを修正して辛抱強く12分待ってから確認するのでどうしても時間がかかる。
今は信号を遅延させたのだが前の信号と違うという状況がわからない。VHDLの慣性遅延のように記述した遅延量以下のパルスは遅延しないのだろうか?
VerilogHDLの遅延は伝播遅延だと書いてあるのを見たことがあったのだが、もう一度調べてみる必要がありそうだ。
Verilogコードは下のようだ。
`timescale 1ps / 1ps
parameter DELAY_TIME = 1500;
assign #DELAY_TIME ddr_dqs_fpga = (enable_o==1'b1) ? ddr_dqs_sdram : {DQS_BITS{1'bz}};
assign #DELAY_TIME ddr_dq_fpga = (enable_o==1'b1) ? ddr_dq_sdram : {DQ_BITS{1'bz}};
assign #DELAY_TIME ddr_dqs_sdram = (enable_o==1'b0) ? ddr_dqs_fpga : {DQS_BITS{1'bz}};
assign #DELAY_TIME ddr_dq_sdram = (enable_o==1'b0) ? ddr_dq_fpga : {DQ_BITS{1'bz}};
parameterの値はDQS_BITSは2で、DQ_BITSは16だ。
ModelSimの波形を下に示す。

上の図でddr_dqs_fpgaを1500ps遅延させてddr_dqs_sdramに入れているのだが、0-3-0と遷移するはずがddr_dqs_sdramでは0-3だけで最後の0の遷移がなくなってしまっている。
慣性遅延でなくなってしまったのか?もう少し調査することにする。
2006.01.29:追記 このページによるとassign文で遅延を書くと慣性遅延だそうだ。伝播遅延にするためにはalways文でノンブロッキング文で書くそうだ。早速書いてみよう。
- 2007年01月29日 06:18 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0
EDSFair2007に行ってきました。
やはりキーノートスピーチには遅刻。展示を見てきました。Synplicity社でSynplify Proのやり方を教えてもらう。Synplify ProからXilinxのISEを起動してインプリメントまで全部できるとのこと。でもISEに入るプロジェクトはEDFなのでXSTに変更して論理合成の差を見ることが出来ないので、やはりISEからSynplify使ったほうが良いかも?
すすたわりさんのところに言ってSUSUBOXを説明してもらう。
井倉さんのプレゼンも聞いてきました。FPGAの電源容量が足りないことが多いというところではドッキリ。でもI/Oも全部計算して十分な容量にしてあるし大丈夫だろうと一安心。XC2VP30のコアに6Aだし、I/Oも6Aの電源だから。PCI-Xバス用の3V電源もXilinxのアプリノートのではいかにも容量が少ないと思ったのでだいぶ大きいのをつけてある。プレゼンの途中で私とブログのことを紹介してもらってしまった。機会も会ったので質問をしたが丁寧に答えてもらった。でも、私のデザインが動かないといっていたようだが、Spartan3E Starter KitでDDR SDRAMコントローラが動かなかったのだろうか?気になる。そういえばFPGAの部屋の名刺を渡すのを忘れていた。。。
ユーザープレゼンテーションを途中まで聴いて帰ってきました。そういえばユーザープレゼンテーション最後PCIボードはPCI Writeがどうして性能が出ないんだろう?私のIPはどっちも同じくらい性能出ているんだけど。。。(プレゼン聞いてこなかったけど。。。)
- 2007年01月25日 21:02 |
- その他のFPGAの話題
-
| トラックバック:0
-
| コメント:3
今のところEDSFair2007に多分いけると思う。
もう井倉氏のセミナーを聞くためにセミナー受講費を振り込んだ。振り込む時にネットから振り込んだので受け取り人名を間違って一度戻ってきてしまった。字が1文字抜けているのがわからずにエレショー協会に電話して振り込めないといったら、調べてくれて、字が抜けているということを教えてもらった。直してもう一度振り込んだらOKだった。しかし、名前が長すぎる。。。絶対間違えるので銀行の振込みリストに登録しておいた。もっと短くしてもいいじゃないだろうか。。。
EDSFair2007はキーノートスピーチも登録したが10時30分にいくのはきついかも?行けるように努力したいが。。。
その後、すすたわりさんも出ているようだしIPフリーマーケットを覗く予定。
そして井倉氏の講演聞いた後はユーザープレゼンテーションを聞きたいが、出展者セミナーに良いのがあれば、そっちに浮気するかも?
とりあえず、ほとんどセミナーを受講する予定。
- 2007年01月24日 05:53 |
- その他のFPGAの話題
-
| トラックバック:0
-
| コメント:4
Xilinx ISE WebPACK 9.1iが出た。日本のXilinxサイトは知らないが
USのサイトからダウンロードした。
今からインストールしてみてみようと思う。
USから落としてきてもインストール画面は日本語になっている。
サービスパック1を落としてかける。
9.1iを起動。なんか8.2iと外見は変化がないみたい。インプリメントも極端に早くなっているわけではなさそうだ。バグとかはFIXされているのだろう?
ちなみにインストールサイズは3.71GByteだった。
- 2007年01月23日 19:59 |
- Xilinx ISEについて
-
| トラックバック:0
-
| コメント:17
親切な方に教えていただいたおかげで、VerilogファイルをModelSimでシミュレーションする際にステートマシンのステート名をwaveウインドウで表示する方法がわかった。教えていただいてありがとうございます。
それは下のようにステートを判別してアスキー文字で表示する方法だ。信号をwaveウインドウに入れて右クリックからRadixをASCIIにするそうだ。
parameter idle_init=10'b0000000001, pall1_init=10'b0000000010, emrs_dllena_init=10'b0000000100,
mrs_dllrst_init=10'b0000001000, pall2_init=10'b0000010000, ref1_init=10'b0000100000, ref2_init=10'b0001000000,
mrs_init=10'b0010000000, wait_init_end=10'b0100000000, init_end=10'b1000000000;
parameter NOP=8'b00000001, ACT=8'b00000010, READ=8'b00000100, WRIT=8'b00001000, PALL=8'b00010000,
MRS=8'b00100000, EMRS=8'b01000000, REF=8'b10000000;
reg [9:0] n_init, c_init; // idle_init, etc...
reg [7:0] n_state, c_state, b_state; // NOP, etc...
parameter idle_dets=3'b001, write_dets=3'b010, wait_write1=3'b100;
reg [2:0] ns_dets, cs_dets; // idle_dets
// synthesis translate_off
reg [20*8:1] MAIN_STATE, INIT_STATE, STATE_DETS;
always @(c_state) begin
case (c_state)
NOP: MAIN_STATE <= "NOP";
ACT: MAIN_STATE <= "ACT";
READ: MAIN_STATE <= "READ";
WRIT: MAIN_STATE <= "WRIT";
PALL: MAIN_STATE <= "PALL";
MRS: MAIN_STATE <= "MRS";
EMRS: MAIN_STATE <= "EMRS";
default: MAIN_STATE <= "REF";
endcase
end
always @(c_init) begin
case (c_init)
idle_init: INIT_STATE <= "IDLE_INIT";
pall1_init: INIT_STATE <= "PALL1_INIT";
emrs_dllena_init: INIT_STATE <= "EMRS_DLLENA_INIT";
mrs_dllrst_init: INIT_STATE <= "MRS_DLLRST_INIT";
pall2_init: INIT_STATE <= "PALL2_INIT";
ref1_init: INIT_STATE <= "REF1_INIT";
ref2_init: INIT_STATE <= "REF2_INIT";
mrs_init: INIT_STATE <= "MRS_INIT";
wait_init_end: INIT_STATE <= "WAIT_INIT_END";
default: INIT_STATE <= "INIT_END";
endcase;
end
always @(cs_dets) begin
case(cs_dets)
idle_dets: STATE_DETS <= "IDLE_DETS";
write_dets: STATE_DETS <= "WRITE_DETS";
default: STATE_DETS <= "WAIT_WRITE1";
endcase
end
// synthesis translate_on

VHDLではステートをtype宣言していて値を直接指定しないのでModelSimでもステート名を表示するのだろう。たとえばこう定義してステートマシンを書く。
type initial_ddr_sdram is (idle_init, pall1_init, emrs_dllena_init, mrs_dllrst_init, pall2_init, ref1_init, ref2_init, mrs_init, wait_init_end, init_end);
type ddr_sdram_state is (NOP, ACT, READ, WRIT, PALL, MRS, EMRS, REF);
signal n_init, c_init : initial_ddr_sdram;
signal n_state, c_state, b_state : ddr_sdram_state;
type dqs_enable_timing_state is (idle_dets, write_dets, wait_write1);
signal ns_dets, cs_dets : dqs_enable_timing_state;
ModelSimでシミュレーションすると定義したステート名でwaveウインドウに表示される。

ステートマシンのステート名を表示することに慣れていると、表示できないとステートがわかりにくい。VHDLはステートマシンを書けばそのままステート名でModelSimのWaveウインドウに表示されるが、Verilogではわざわざ書かなくてはだめだ。この辺はVerilogは面倒だ。最終的にVHDL,Verilogどっちがメインで書くか迷ってきた。それぞれに良いところがあるし悪いところもある。
- 2007年01月23日 18:37 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0
障子が破れてどうしようもなくなったので障子貼りをした。
最初に障子紙を全部破く、これは子供達の仕事。
その後水にぬらして格子の部分の障子紙を取る。今回は硬いスポンジでこすって取った。そして乾かす。
その後、普通はのりを格子に塗って障子紙を貼るのだが、結構のりを塗るのが難しい。のりを刷毛で塗っていると格子の部分に溜まりやすいのである。今回は障子用の両面テープを張って障子紙を貼ることにした。結構両面テープを張るのも面倒だが余計なのりがでないのでやりやすい。
その後、奥さんに手伝ってもらって障子紙をその上に載せた。その後、障子の大きさにカッターでカットで終わり。結構しわが寄ってしまった。その辺は素人仕事ということでOK。
一日、障子貼りで終わってしまったが、新しい障子はとても良いものだ。
- 2007年01月21日 20:01 |
- 日記
-
| トラックバック:0
-
| コメント:0
今日の午後八千代町にある
やちよ乃湯に行ってきました。
八千代グリーンビレッジという公園内にあって、キャンプ場、アスレチック、芝生の公園などがあるとても立派な施設です。
憩遊館「やちよ乃湯」に入ると野菜や名産品などが売っています。(人のことは言えませんが)田舎なので、取れたてのとても新鮮な野菜が安い!!!
うちでも大根、ねぎなどを購入。干し納豆や、金山寺味噌も購入しました。
風呂はというと、建物の中の風呂はビアスパーク下妻より熱くて入るのが大変。(ぬる目が好きです)外の露天風呂はちょうど良い温度でした。ですが、ぬるいと思っても、さすが天然温泉よくからだが温まりました。なかなか良かったです。
今度は
八郷の温泉に行ってみようと思っています。
- 2007年01月20日 21:58 |
- 日記
-
| トラックバック:0
-
| コメント:0
DDR SDRAMコントローラVerilog版が動かないのでModelSimでシミュレーションをしていたらステートマシンのステートがステート名で表示されないことに気がついた。
最初にparameterで値を定義しているのに。。。
parameter NOP=8'b00000001, ACT=8'b00000010,.....
n_state <= NOP;
というようにやっているのに、waveウインドウでステートマシンのステートを見ると、n_stateやc_stateが00000001と値で表示されている。parameterでステート名を指定したのではModelSimでは値で表示してしまうのだろうか?

`defineでステート名を記述すると大丈夫なのだろうか?
VHDLではステート名で表示されていたので、これで表示されないと気に入らない。
一度`defineでやってみようと思う。
2006.01.21追記:やはり`defineでも同様でした。
VHDLのようにwaveウインドウでステートマシンの現在のステートをステート名で見る方法をご存知の方はぜひ教えてください。
- 2007年01月20日 21:34 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:2
最近お仕事はデバックしている。PowerPCプロセッサが603eから7447Aに変更したのだが、大幅に性能が良くなっているようだ。
あるソフトを学生と一緒にデバックしていたのだが、どうもDMAがうまく動かない。DMAの設定レジスタはキューになっていないので終了を判定してもう一度設定するのだが、どうも終了を判定しないで設定しているようだ。ソフトはちゃんと終了判定しているのだが、うまく動かない。
ChipscopeでPowerPCのアクセスを見てみると設定レジスタにDMAスタートを書く前に次のステータスレジスタのポーリングが入ってしまっているようだ。これではだめだ。
結局、eieioかsync命令を使って同期を取ったらうまくソフトが動いた。603eでは大丈夫だったのだが、これからは同期に注意してソフトを作る必要があるようだ。(私は作らないけど)
ここまで同期を取る必要があるとは思わなかったが、考えてみればアウト・オブ・オーダ実行なので当たり前かな?
- 2007年01月18日 13:10 |
- その他のFPGAの話題
-
| トラックバック:1
-
| コメント:0
Verilog2001版DDR SDRAMコントローラーをISEでインプリメンテーションしようと思ってやってみた。
プロジェクトを作ってファイルを入れてみたが、入れたのにデザインがないといってプロジェクトのツリーに入らないのがある。

上の図でwrdata_fifo.vなどがそうだ。なぜ入らないかか調べてみると// synthesys tarnslate_off, // synthesys tarnslate_onの組があるとだめなようだ。synthesys tarnslate_onが効いていない様だ。

XSTのマニュアルにも書いてあるし大丈夫なはずなのだが、これを削除するとなぜかプロジェクトのツリーに入る。
ISEでの削除の仕方はSourcesペインのSourcesタブでは削除できないのでLibrariesタブを選択してworkを展開する。右クリックしてRemoveを選択する。

Confirm Removeダイアログが開くので”Yes"をクリック。

これでプロジェクトから消えた。
// synthesis translate_off
`uselib lib = unisims_ver
// synthesis translate_on
を消してもう一度プロジェクトに入れるとSourcesペインのツリーに入る。

とりあえず`uselib lib = unisims_verは使わないようにしようと思う。ModelSimでのシミュレーションはvsimのオプションに-L unisims_verを追加しておけば大丈夫だろう。
- 2007年01月17日 20:11 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0
今日のXilinxからのメールによるとISE9.1iが出たそうだ。
売り物と
体験版は出ているが、
WebPACKはComing Soonだった。
- 2007年01月17日 09:02 |
- Xilinx ISEについて
-
| トラックバック:0
-
| コメント:2

この前からやっているVerilog2001版DDR SDRAMコントローラーのModelSimシミュレーションだがバグを修正してStart Simulateion...してelaborateすることが出来た。それは良いのだが、実際にrunするとメモリを2GB以上食いまくって遅くなりすぎてしまったのでタスクマネージャーよりModelSimを落としてしまった。
うちのマシンのメモリは1GByteなので無理である。今までは512MbitのDDR SDRAMでシミュレーションしていたので、もっとDDR SDRAMのモデルを容量の少ないものに変更して試してみようと思う。
2006.01.16追記:ModelSim SEでやってみたらシミュレーションは出来たがDELTAが7くらいになって数十ns進むのにだいぶ時間がかかってしまい実用にならない。resolutionを下げるかVHDLのDDR SDRAMモデルでやってみようかと思う。Verilogでresolutionを下げるにはソースの`timescale 1ns / 1psを変更するのだろうか?
それともModelSimのresolutionを設定すればよいのだろうか?
いずれにせよISEによるインプリメントを優先してやろうと思う。
2006.01.20追記:シミュレーションに時間がかかったのは
for (i=DDR_DQS_DM_WIDTH-1; i>=0;
i=i+1) begin
のように間違って書いてしまったからのようだ。(本当はi=i-1)integerの上限までやって、ぐるっとまわって止まったから時間がかかっていたようだ。XSTで論理合成したらエラーで止まったのでわかった。これを修正したらシミュレーションできるようになったが、まだどっかにバグがあるようだ。
- 2007年01月15日 21:49 |
- 入門Verilog
-
| トラックバック:1
-
| コメント:0
いやーVerilogのシミュレーションてなかなか大変なんですね。
今度はまたStart Simulation...でのようなエラーが出てしまった。
# ** Error: (vsim-3043)C:/Xilinx/verilog/src/unisims/FDDRRSE.v(39): Unresolved reference to 'glbl'.
# Region: /DDRtest_tb/DDRtest_inst/ddr_sdram_cont_inst/dcm_module_inst/genblk1[0]/DDRCLK_INSTえ?glbl? こんなのまったく知らないし、こういうモジュールも作ったことない?
おかしいのでXilinxのアンサー・サーチで調べてみるとありました。
シミュレーション、UniSim、SimPrim - Verilog シミュレーションで glbl.v モジュールを使用する方法
それによると、
glbl.v モジュールは、デザインのグローバル セット/リセット信号とグローバル トライステート信号を接続します。 Verilog シミュレーションでデザインを正しくリセットするには、glbl.v モジュールをデザインと共にコンパイルし、読み込む必要があります。 glbl.v モジュールは、$XILINX/verilog/src/glbl.v にあります。
自分のデザインと一緒にコンパイルして読み込まなくてはいけないらしい。次に論理シミュレーションのやり方のアンサー・サーチを見つけた。
ModelSim (MXE, SE, PE) - How do I run a functional (behavioral) simulation with ModelSim stand-alone? (VHDL, Verilog)それによるとsimulationのコマンド列の最後にwork.glblをつけなくてはいけないらしい。それはそうかglbl.vをコンパイルしただけで、どっかでインスタンシエーションしてないから。。。それでsimulationコマンドはこうなった。
vsim -t ps work.DDRtest_tb work.glbl
まだ他のエラーが出ているのでバグ取り続行中。いろいろ出てくるので楽しみながらやっています。技術論文のバグ取りも並行してやっているので歩みがのろい。
しかし、いろいろ楽しませてくれるぞ、Verilog。なんか面倒くさい。
2006.01.14追記:PicoBlaze本体(kcpsm3.v)をプロジェクトに追加するのを忘れていた。プロジェクトに入れたらやはりプリミティブが見つからないと言われた。やはり自分で作った以外のVerilogファイルは
`uselib lib = unisims_ver を追加することが面倒だし、自動生成するVerilogファイルは直すのが面倒なためvsimのコマンドラインでライブラリを読むように追加するのが良いようだ。つまりこうなる。
vsim -t ps -L unisims_ver work.DDRtest_tb work.glbl
Verilogのバグ取りをしていると、インスタンシエーションしたサブモジュールから出力する信号をregで宣言してしまった。wireで宣言しなくてはいけないようだ。これはシミュレーション開始する時しかわからないのでエラーをクリックしてもエラーの番号に飛べない。これは不満だ。
VHDLならばコンポーネント宣言しているので宣言と違っていればすぐわかる。といってもVHDLはsignal宣言( variableもあるけど)しかないのでこういう間違いはない。Verilogもあらかじめ呼び出すサブモジュールのプロトタイプ宣言しても良いのじゃないだろうか?
- 2007年01月14日 05:19 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0
いまVerilogの勉強をしながらVHDLをVerilogに書き直している。Verilogを書いていると疑問がわきあがってきた。
VHDLだとfor generateやfor loopで使用する変数?iは定義されforの中だけでローカルに使用される(私はそういう解釈だった)。
例えばこんな感じ。(前にprocess文はあります)
for i in 0 to DDR_DQS_DM_WIDTH-1 loop
dqs_reset_1d(i) <= dqs_reset;
dqs_enable_1d(i) <= dqs_enable;
end loop;
for i in 0 to DDR_DATA_WIDTH-1 loop
dqs_enable_2d(i) <= dqs_enable_1d(i/8);
dqs_reset_2d_dqtri(i) <= dqs_reset_1d(i/8);
end loop;
でもVerilogはiを使うとしたら最初にinteger i;として宣言するようだ。そうするとfor(;;)を2つ以上変数iを使用するともしかするとだめなのか?
自動的にコピーを作ってくれれば大丈夫だとは思うが。。。どうなんだろう。
for (i=0; i<=DDR_DQS_DM_WIDTH-1; i=i+1) begin
dqs_reset_1d[i] <= dqs_reset;
dqs_enable_1d[i] <= dqs_enable;
end
for (i=0; i<=DDR_DATA_WIDTH-1; i=i+1) begin
dqs_enable_2d[i] <= dqs_enable_1d[i/8];
dqs_reset_2d_dqtri[i] <= dqs_reset_1d[i/8];
end
C言語だと逐次実行なのでiを使いまわしても問題ないがVerilogだと同時実行だから問題があるのかも???
そういえばgenvar i;も2回目のgenerate文の中で宣言すると怒られるのでgenerate文の中でローカルに使用されているのではないらしい。ということはこっちも同じiを使ってはだめなのか?
いずれにせよ。シミュレーションできればわかることだが。。。
2007/02/15: always @の中の i はローカル変数として定義して、genvarはそれぞれにユニークな数にすることがわかった。詳しくは、
Verilog2001版DDR SDRAMコントローラのバグ参照。
- 2007年01月12日 05:44 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションを進めている。大体コンパイル時のエラーは取れてModelSimでSimulateするところまでこぎつけた。でもSimulateメニューからStart Simulation...を選んでテストベンチのトップを選択しするとエラーが出る。それはDCMやBUFG、RAM16X1Dなどのmoduleが見つからないというエラーだ。Transcriptペインを見るとSearched libraries:がworkだけになっている。

これでは見つからないのも無理はない。VerilogでXilinxのunisimライブラリを参照するにはどうしたらいいんだろう。VHDLだとHDLソースに下のように書けばいいんだけど。
library UNISIM;
use UNISIM.VCOMPONENTS.ALL;
Verilogはどうしたらいいんだろうということで困った時のネット検索に頼った。そうするとKyoshowさんの
ModelSimの使い方がヒット。それによるとファイルを右クリックしたメニューからProperties...選ぶとダイアログが出る。ダイアログのVerilogタブを押すとありました”library Search...”ボタンをクリックしてVerilogのunisimの位置を指定。"-y H:/HDL/ModelSim_starter_61e/xilinx/verilog/src/unisims"
早速、再コンパイルしてやってみるがやはりだめ。よくダイアログを見たら"Project Compiler Settings"だった。Compiler Settingsは関係なさそうである。
改めてXilinxのアンサーサーチを検索してみると、
”ModelSim (MXE、SE、PE) - Verilog デザインで UniSim コンポーネントが使用できない”が見つかった。
それによると
`uselib lib=<library_mapping_name>
をVerilogソースに追加するそうだ。
実際には
// synthesis translate_off
`uselib lib = unisims_ver
// synthesis translate_on
をUNISIMライブラリを使うVerilogファイルの最初に入れた。そうしたところ
# ** Error: (vsim-3033) H:/HDL/FndtnISEWork/Spartan3E_starter_kit/DDRtest_org_verilog/ddr_controller_ono/dcm_module.v(51): Instantiation of 'BUFG' failed. The design unit was not found.
# Region: /DDRtest_tb/DDRtest_inst/ddr_sdram_cont_inst/dcm_module_inst
# Searched libraries:
# workというエラーはなくなった。このトラブルはシュートできたようだ。
でもその他のビット幅が合わないとかのエラーは出ている。今度はそれらのバグをシュートしようと思っている。
今回のバグはVerilogを使っている人には既知のことかも知れないがVHDLを使っていた私にはどうするのかわからなかった。
ちなみに仕事用パソコンはまだ完全に復旧していない。明日あたりは大体復旧できそうだ。今度はNortonゴーストを買ってディスクイメージを取っておこうか。。。
- 2007年01月11日 06:28 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:0
全国大学女子選抜駅伝がつくば市で行われた。近所の人は筑波大学まで見に行ったそうだが、私はテレビ東京で中継していたのでテレビで観戦。
あ、あそこが写っている。大穂のマクドが写っていると盛り上がってしまった。来年もやるならば見に行こうか?
だいたい技術論文は仕上がったので、今度はVerilog2001のお勉強を再開。おおよそ出来たのでModelSimで書き方が正しいか確認してみる予定。
並列して
エラゴン(ドラゴンライダー)も読んでいる。とてもおもしろい。
エルデストも買って
下巻の途中まで読んでしまった。映画にも行ってみたい。
- 2007年01月08日 16:42 |
- 日記
-
| トラックバック:0
-
| コメント:0
仕事で使っているWindowsパソコンが壊れてしまってWindows XPが立ち上がらない。
修復セットアップを試みるがだめ。もう一度修復セットアップするとセーフモードでだったら立ち上がった。Cドライブのエラーチェックを”不良セクタをスキャンし回復する”にチェックを入れてやったところ、セーフモードでも立ち上がらなくなった。
やはりHDDが壊れたか?2つHDDがあるのでもう1つにWindowsをインストールして立ち上がるようにしたが、もうCドライブのHDDは回復させても使わないほうが良いだろうか?
正月早々パソコンが壊れるとはついていない。しばらくパソコンの回復に努めなければ。。。
ちなみにCDブートLinuxの
knoppixを起動してみたところ問題ないのでグラボなどのハード的には問題ないようだ。
- 2007年01月05日 19:06 |
- パソコン関連
-
| トラックバック:0
-
| コメント:2

今日は
大生郷天満宮に初詣に行ってきた。
筑波山神社は混んでいるだろうし行ったことがないところに行こうと思った。なかなか良いというので行ってみたが、
筑波山神社に比べるとあまり立派ではないかなと思った。だが駐車場に止めやすいし手軽な神社だった。うちの奥さんは甘酒がないのが不満のようだった。筑波山神社やいつも行っている水海道の神社は甘酒が飲めるのだ。
私以外はおみくじをした。大吉が2、吉が1、末吉が1だった。
- 2007年01月02日 22:06 |
- 日記
-
| トラックバック:0
-
| コメント:0
EDSFair2007に申し込んだ。
キーノートスピーチと今回は珍しくお金を払って
FPGA/PLD Design Conferenceにも申し込んだ。井倉さんの”これで良いのかいまどきのFPGA設計”という講演を聴きたいためだ。どうも気になっているので聞いてみたい。
IPフリーマーケットにすすたわりさんも出ているみたいだし覗いてこなくては。。。その後の
ユーザ・プレゼンテーションも楽しみだ。
今のところ金も払うのだしぜひ行こうと思っているが問題は足の指が折れているので会場まで行けるかどうかだ。だいぶ直ってきたのでいけるとは思うのだが、私の場合はいろいろ体に不具合が出るので良くわからない。
- 2007年01月01日 09:01 |
- その他のFPGAの話題
-
| トラックバック:0
-
| コメント:5

2007年の初日の出です。
今年もよろしくお願いいたします。今年は良い年にしたいと思っています。
今年の目標
1.Virtex5をテストする(ボードがほしい)
・DDR SDRAMコントローラを移植したい
・PCI-Expressエンドポイントをシミュレーション、インプリメントしてみたい
2.Verilog2001でテストベンチを書けるようにする
3.PCI-Xモジュールを作成
あくまで目標ということであせらずにやっていこうと思っています。
2006年12月のアクセス数は21,680アクセスでした。ありがとうございました。
- 2007年01月01日 07:23 |
- 日記
-
| トラックバック:0
-
| コメント:2