<< 2026年01月
新着記事
最近のコメント
月別
カテゴリ
2025.11.20 15:03

とりあえず結論:interface


・さて、とりあえずLED点滅を使って実際にFPGAでお試し。
・結果を言えば駄目だった。
・interfaceのポートリスト以外で宣言した信号がピンに引き出されてしまうのを避けるためにvirtualに設定してみたのだけどもね。
 たとえば、
 interface xxx (... ,inout logic[7:0] data_bi);
....
logic data_oe;
logic[7:0] data_out;
assign data_bi = (data_oe) ? data_out : 'z;
....
endinterface
なんてことをして、data_outが出るのをやめさせるためにvirtualにすると、data_biにも何も出力されない。data_oeがうまく読めていないのかと思ったけどそうではない。
・ということで残念ながら、普通にトップモジュールのポートリストで書くしかないなという、つまらない結論にしておこう。
・長い長い遠回りだったけど、こういうのも経験さ。おかげで勉強になった。


2025.11.19 23:48

腕時計のいただきもの


・先日古い某会社名入りのなんかの記念品のような腕時計を頂いた。古いとはいってもクォーツ式なのでアンティークというほどではないけれど、ベルトはボロボロになってしまっている。
・とりあえず電池交換をお願いするかと近所に出向いたら即日はできないようで預かり品になっていたのを今日取りに行った。
・「残念ながら電池を入れ替えても動きませんでした」ということで、引き取ったのだけど、竜頭をいじっていたら突然動き出した。でも、動かなかったということはまたすぐ止まるのかな。
・しばらく様子を見ていたけど動いているようなので、ちょっと使ってみるかとベルト交換。手持ちのものだと残念ながらサイズが合わなかったのでホームセンターに買いに行く。
・元からついていたのと似たようなものがあったので、購入。昔は1000円くらいで買えたとおもったのだけど、1500円ほど。
・交換は難しくない。ピンをグッと押して付け外しするだけ。
・交換してみるとなかなか良い感じ。いつまで動くかわからないけどありがたく使わせていただこう。


2025.11.18 23:29

Quartus君とinterface


・さてinterfaceが思ったように動き出したのでそれならばと合成してみることに。
・interfaceのポートリストには外部ピンとつなぎたいもの、そして内部のモジュールとつなぎたい信号類はinterfaceの本体側に書いてある。イメージとしてはこんな感じ。
 interface (input logic RESET, CLOCK, inout logic[7:0] DATABUS);
logic[7:0] data_out;
logic[7:0] data_in;
logic data_oe;
modport slave(output data_out, data_oe, input data_in);
endinterface
・Quartusでプロジェクトを作成して、ソースコードをプロジェクトのディレクトリにコピーしてQuartusに登録。
・これでAnalysis&Synthesis。エラーなく終わったのでAssignments=>Pin Plannerを見るとdata_outなどまでピンに出そうとしている。
・どうやらQuartusはポートリストと内部との区別をしないらしい。
・これではちょっと困る。何か手はないのかとダメ元でGeminiにお問い合わせしていたら「設定ファイルでVirtualに書き換える」というのを提示された。
・そんな設定があるなら絶対Quartus上からできるはず・・・と探したらアルティマさん作成のQuartus Prime
よく使用するピン・オプションの設定方法
なんていうドキュメントがあった。これの最後の方の11章で「仮想ピンの設定」がある。なるほど、ピンに割り当てたく無いならこんなふうにすれば良いのか。
・Assignments=>Assignment Editorで起動しておいて、試しにTo欄でdata_outをvirtualに設定して、もう一回Analysis&SynthesisしてPin Plannnerを開いたらピンのリストからdata_outピンが消えた。なるほどね。
・ちゃんと動くのかどうかはまだわからないけど、これで外部バスをinterfaceとして記述して、テストベンチを作ってシミュレーションして、Quartusで合成するというところまで問題なくいけることはわかった。なんか随分手間取ったけど、おかげでいろいろすっきりと腑に落ちたな。
・あとは実際に動くかどうか。これは実機で動作確認できるソースにしないとな。DE-10LITE使ってLEDとスイッチでやってみるか。


2025.11.17 19:30

やっと動いたInterface


・というところで実装してみる。話はわかったので難しくはない。
・まずはターゲットとなるモジュールを作る。
・普通だとこれをテストベンチでインスタンス化してテストベンチ内の記述でダミーの信号を与えるわけだけど今回はちょっと違う。
・このターゲットの相手となるバスマスタモジュールを作る。
・そして、テストベンチではターゲットとバスマスタモジュール、そしてInterfaceをインスタンス化してこの3つを結合する。
・双方向バスの3ステート制御はInterface部分のお仕事
という具合。
・これでやっとできたかなと思ったけど、DSimではエラーが出る。間違ってないはずなんだけどなと思いながらVerilatorでやってみたら何も問題なく出来上がって、シミュレーションのも動いた。
・さて、DSimのエラーは何だろうと改めてメッセージを見たら「そんなインターフェースなんて知らんぞ」ということ。あぁ、ひょっとして・・・ということで、プロジェクトにインターフェースのソースコードも追加してやって改めてやり直したら無事にパスして、ちゃんと波形も表示された。
・さて、あとはこういう記述がQuartusで許されるのか、ちゃんと合成できるのかというところだな。
・そんなところでいろいろ算段。こういうのは苦手なんだよなぁ。Pythonあたりを使ってシミュレーションで何かできないものかなと思ってしまったり。

2025.11.16 19:17

Interfaceはそういうことか


・その後あちこち眺めたりGeminiにお問い合わせししていてだいたい見えてきた感じ。
・結局テストベンチのことまで考えると3-Stateバッファをモジュール側で実装するのは面倒そうで、interfaceに実装するのがシンプルかつ確実ということになるようだな。
・そういえば振り込みもしておかないとな。法人口座は明日でないと難しいから明日やっておこう。

2025.11.15 12:54

interfaceで相変わらず


・相変わらずという感じでinterfaceでお悩み中。
・そんなところで、「存続危機事態」発言に対して暴れている方々がいる。でも、確かにあそこを押さえられたら大動脈に血栓ができたような状態になるわけで、まさしく生命の危機、存続危機事態であることは間違いない。
・その時に何をするのか、しないのかはまた別問題だけど、単に傍観だけしていたらこちらの命に関わる事態であることは確かではある。
・とりあえず「最悪の事態を想定してそれに備えておく」というのは大切なこと。そんな事態にならなければそれが一番だ。「何より楽で良い」

2025.11.14 17:10

interfaceで方向が決まっているようなのはポートリストで書け・・かな?


・SystemVerilogのInterfaceあれこれ。
琉球大学さんのサイトのPDFがあったのでこちらもチラ見。
・結局のところ、interfaceは内部のモジュール間接続を想定しているので、3-stateはやりにくいのかな。
・チップ外とのインターフェースをinterfaceで書くとしてもテストベンチを使う時は双方向同士がつながるしで。
・結局方向が決まっている信号はポートリストに書けということになって
interface xxx(input logic clock, reset, inout logic[7:0] databus);
logic a,b,c;
modport Tx(output a,b, input c);
modport Rx(input a,b, output c);
endinterface
なんて具合にしろっていうことになるのかな。
・これを使おうとしたらモジュール側では
xxx bus (clock, reset ,databus);
なんて調子になってくるのか。
・外部とのインターフェース部分では方向が決まっていることも多々だけど、そうするとなんだかモジュールで書くのと大差なくなってしまうか。

2025.11.13 23:33

SystemVerilogのinterfaceがやっと腑に落ちた


・そんなこんなで現状in/outで別れているバスを双方向バスに作り変えようとしたのだけど、これがうまくいかない。interfaceを使っているとうまくいかないのかな。
・と思って改めてドキュメントを探していたら、Using SystemVerilog “Interfaces”
as Object-Oriented RTL Modules
というものを発見。どうやらinterfaceに関する自分の理解が間違っていたということがわかる。なるほどね。そりゃそうだし、今まで感じていた違和感も含めて納得。
・interface xxx #(type t=logic)という記述は初めて見たけど、こう書いてやればインスタンス化するときにxxx #(logic [7:0])なんてやって動的にバス幅などを変えられるという仕掛けか。
・仕方ない。行き詰まっていたソースは捨ててgit reset --hardしてやり直そう。

2025.11.12 07:29

双方向バスのテスト


・ロジックアナライザというのか、PicoScopeを収納しておくのに手頃なキャンバスバッグがったので、本体+プローブ4本+ロジックプローブを入れているのだけど、ロジックプローブは例によってクリップがたくさんあるので、袋だと出し入れがちょっと面倒・・・ということで、100均で手頃そうなケースを見つけたので使ってみたら空いていたスペースにジャストフィット。
・双方向バスの記述ってこんな感じでいけたっけ?と思って試し書き。当初
 assign data = (data_oe == 1) ? data_o : z;
なんて書いてしまったら「zなんて無いよ」と言われてしまった。「'z」としなくてはいけなかったのか。そりゃそうだよね。
・ならば、always_combの中に書いても良いのかなと思ったけどエラー。なんでと思いながらいじってたらエラーが無くなった。
always_comb begin
data = (data_oe == 1) ? data_o : 'z;
data_i = data;
end
・でも、この三項演算子をif文に書き換えたらエラー。なんだかややこしいヤツだな。


2025.11.11 18:10

ロジックアナライザの準備


・さて、ボチボチ実機を動かさなくてはというところで、まずは今の所FT_PROGで非同期FIFOモードになっているはずなので、このモードで動かしてやろうじゃないかというところ。FT_Writeしてやれば良いのかな?
・というところで、やっぱりロジックアナライザの準備もしておかねば。
・AcuteさんのTravelLogicのJDSさん(その後ELECOM)のOEM版・・・といってもすでに製造中止。そういえばサポートソフトウェアは?と思ったけど今の環境に見当たらない。
・なんとなく検索していたらLinux版のページを見つけたので試しにダウンロードしてみたけど、やっぱり対象外の機種のようで相手にしてもらえなかった。
・というところで、やっぱりPicoScopeだな。ちょっとサイズは大きいけど、Linux上で動かせるし、アナログデジタル連動でシミュレーションできるし。
・とりあえず久しぶりなので下準備ということで、以前インストールしていたアプリを起動。24.04になってからは初めての起動じゃないかなと思うけど、何も問題ない。
・起動したらとりあえずアナログチャンネルが動いている。デジタルチャンネルを増やしたらした半分に表示された。
・プローブをつけて、ついでにデジタルのコネクタもつけて、とりあえずアナログプローブでテスト信号端子をつまむ。
・レンジ切り替えも問題なし、トリガもこれでよしか。簡単だな。なるほど2Vの矩形波だな。
・2Vならそのままロジック側のプローブもいけるだろうということで、つまんでみる。うん、ちゃんとアナログデジタル連携。トリガ条件もポチッとクリックして、アナログからデジタルチャンネルに変更するだけ。
・これなら何も問題ないだろう。よしよし。
・これとAlteraのSignalTapのロジックアナライザ機能を併用すればまぁいろいろいけるだろう。
・あとは・・・DE10には個別LEDの他に7セグもついてるしな。