2026年3月3日火曜日

IIC-OSIC環境を使ってLibreLaneを実行する:RISC-Vを動かしてみよう (2026年2月版)

前回まではチュートリアルだったので,今回は応用編として RISC-V コアを実装してみよう.使う題材は Harris&Harris の RISC-V コア,これは SystemVerilog で書かれているので,Verilog に実装しなおしてみる.

RISC-V コアの準備


主な変更点は,
・RISC-V コアとテストベンチを分離,命名ルールを simulate.sh に合わせる([回路].v,[回路]_tb.v)
・入出力ポートの定義を Verilog に変更
・logic を適切に wire に
・always_comb,always_ff を適切に変更
・一部 case 文を always から function に
・メモリのアラインメントが不親切だったので明示的にした.具体的には
rd = RAM[a[31:2]];
rd = RAM[{2'b0,a[31:2]}];
へ MSB側 をゼロ埋め.

はまったのはジャンプ命令が正しく動かなかったり,always 文で書いた組み合わせ回路のセンシティブビットの指定が不十分だったり,という点であった.Verilog 素人なので2~3日ぐらいかかった.こんなやつが授業で Verilog 教えるってマジ?

シミュレーションが正しく動くと,テストベンチでは DataAdr = 100 の時に WriteData が 25 であるか判定し,正しければ "Simulation succeeded",正しく終了しない場合は "Simulation failed" と表示される.

$ cd kvic_226007_ws25-main/verilog/tb
$ sh simulate.sh riscv_top


Yosysによる合成


src ディレクトリに移動し,yosys_stats.sh を実行してみる.
$ cd ../src
$ ln -s ../tb/riscv_top.txt # 命令メモリの中身をリンク
$ sh yosys_stats.sh riscv_top

実行するとログが出てくる.

 

まあまあな数のセルが使われている.一番大きいのはDFFベースのメモリだろう.

LibreLaneによる配置配線


実行前に変更すべきなのは config.json と pin_order.cfg.それぞれ config.json は次の通り,
 
 pin_order.cfg は次の通り変更する.
 
この地点で試しに実行してみたら,合成の地点で

 
と規定のサイズ (160 um x 100 um = 16000 um^2)を超えてしまい,

 
Utilizationでかすぎ,と失敗してしまう.なので config.json 中の面積を
0 0 160 100
から
0 0 320 300
として,合成時の Utilization が 40% 程度にしてみた.そのほかの制約は変えず,Sky130 対象に合成制約 20 ns = 50 MHz とし LibreLane を実行してみる.

$ ./run_librelane.sh

しばらく待つと処理が終わり,OpenROAD での配置配線結果が出力される.


レイアウトを見るとポートは East と West に固めたはずが他にも配置されてしまっている.DRC/LVS はパスしたが,Antenna 違反が発生していた.

 

使われたセルの統計データは次の通りであった.

 
DFF (dfxtp_1,dfrtp_1,dfrtp_2) が820個しかないのは,命令メモリが ROM になって最適化されてしまったためと思われる.おそらくゲートがVDD/VSS に接続されてしまったのでアンテナ違反が発生しているのだろう.このあたりはきちんとしたメモリがほしいものだ.

2026年3月2日月曜日

IIC-OSIC環境を使ってLibreLaneを実行する:チュートリアルを動かしてみよう (2026年2月版)

IIC-OSIC の環境を使って LibreLane による配置配線を試みる.

IIC-OSIC のインストール

基本的には土谷先生の方法でよい.

IIC-OSIC ツールの実行

基本的には公式ビデオを参考にすればよいのだが,いろいろ不完全なので補足を入れていく.

まずは Tutorial ファイルをダウンロードする.動画のスライド p17 のファイルをダウンロードする.


このとき Docker 内に最終的にファイルを置かないといけないので,Docker 内の Ubuntu でFireFox などでダウンロードするか,
C:\Users\[ユーザー名]\eda\designs
に Explorer からアクセスすると Ubuntu の起動時のディレクトリにアクセスできる.

Verilog シミュレーションと yosys による合成

verilog ディレクトリに移動する
$ cd /foss/designs/kvic_336007_ws25-main/verilog

シミュレーションは tb ディレクトリで実行する.
$ cd tb
$ sh ./simulate.sh counter

simulate.sh の引数である [回路名] に対し,verilog/src/[回路名].v,verilog/tb/[回路名]_tb.vを探し,verilator で LINT,iverilog で Verilog シミュレーション,波形ファイル生成([回路名]_tb.vcd),gtkwave で波形を表示できる.



3 bit カウンターとして動いている事を確認する.

次に合成する.src ディレクトリの yosys_stats.sh を実行する.
$ cd ../src
$ sh ./yosys_stats.sh counter

実行すると,yosys にょって
read_verilog 
proc (process をnetlistに変換)
opt (簡単な最適化)
flatten (階層展開)
techmap (テクノロジマッピング)
stat (回路の統計情報表示)
が実行される.ただしここでのテクノロジマッピングは特定のプロセスライブラリではなくyosys の持つ仮想ライブラリで合成されるようだ.

LibreLaneによる配置配線

次に LibreLane で配置配線を行う.
$ cd ../../librelane

run_librelane.sh に実行権限を与えて実行してみる.
$ chmod +x run_librelane.sh
$ ./run_librelane.sh

run_librelane.sh では,テクノロジライブラリを指定 (sky130A),LibreLane による実行,LibreLane の実行結果を OpenROAD で開く.


LibreLane の全体設定ファイルは config.json で,回路名,Verilog 記述の場所,シリコン面積,SDC などの設定,IO ピンの順番などを指定できる.
(逆に言うと,この程度しかカスタマイズの余地はないのか)

実行結果は runs/RUN_[日付]_[時間]/ 内部に処理ステップに沿って以下のように格納される.
 

最終的に出力されるものは final に格納される.
例えば最終的なGDSを見たければ runs/RUN_[日付]_[時間]/final/klayout_gds にアクセスするとよい.
$ klayout runs/RUN_2026-01-30_08-00-21/final/klayout_gds/tt_um_counter_top.klayout.gds


回路のPPA,QoR,DRC/LVSなどの統計は  runs/RUN_[日付]_[時間]/final/metrics.csv に書かれている.
$ cat runs/RUN_2026-01-30_08-00-21/final/metrics.csv 

 

2026年1月30日金曜日

卒論前に物が壊れるジンクス

卒論のシーズンは何かとものが壊れがちで一般的には学生のパソコンが壊れるのだが,今回新たに「教員室の蛍光灯がきちんと点かなくなる」事態が発生した.しかも事務室の閉室後の金曜夕方に,である.


写真だとよくわからないけれど,実際は暗くてとても作業できない.卒論とはかくも過酷な挑戦なわけである.
(えーん暗いよー)

2025年11月30日日曜日

X11 connection rejected because of wrong authenticationと表示され GUI アプリケーションが立ち上がらない

IC Compiler II などにGUIアプリケーションを起動しようとすると,"X11 connection rejected because of wrong authentication" と表示されて GUI が立ち上がらない事が起きた.

% icc2_shell -gui
(icc2_shell が立ち上がる)
X11 connection rejected because of wrong authentication.
Cannot initialize GUI.
The connection to X-server 'localhost:10.0' is broken or refused.
Please check the value of the DISPLAY environment variable.
For this session, the tcl command 'setenv' can be used to set the value of the DISPLAY variable,
then the command 'gui_start' is used to start the GUI.
icc2_shell > 

これを解決するためには,以下を設定すればよいらしい.
% export XAUTHORITY=$HOME/.Xauthority

Xauthority は XServer の認証の際に xauth が使用する Cookie に資格情報を保存するために使用されるらしい.xauth は Xauthority と $DISPLAY 変数を用いて X の接続を行う.

stackexchange の説明では,Snapを用いるアプリケーションはHOME="$SNAP_USER_DATA" を設定するためこれが X が想定する Xauthority ファイルの場所と干渉する,とのことである.IC Compiler II がSnapで作られているとは思わないが,似たような現象が起きているのだろう.


じゃあ Xauthority どうやってつくるの?というとこれはsshログイン時に自動で作成されるらしい.

2025年11月29日土曜日

Virtuoso (IC618.170) で標準ライブラリが見えない

 表題の通りで,IC618.170 に乗り換えたら,
Cannot find file '$(compute:THIS_TOOL_INST_ROOT)/share/cdssetup/cds.lib'.
と CIW に表示されて標準ライブラリ (ahdlLib, analogLib, など) が見つからない.

IC618 と見比べていると,IC618 の cds.lib は
'$(compute:THIS_TOOL_INST_ROOT)/share/cdssetup/cds.lib'.
にあり,IC618.170 のそれは
'$(compute:THIS_TOOL_INST_ROOT)/share/cdssetup/dfII/cds.lib'.
にある事がわかった.

どーしてこういうことをするかなーもー.(IC618.170を窓から放り捨てる音)

2025年11月21日金曜日

ngspice の収束で困っていたときに使うとよい .options

 ngspice の収束で困っていたときに見つけたのでメモ


過渡解析がおおよそうまく行く SPICE のオプションとその説明

.options gmin=1e-10 : ダイオードとトランジスタ内の各ダイオードに並列に  1e10 (=10GOhm) の大きな抵抗を追加.
.options abstol=1e-10 : 収束基準の許容誤差を 1e-12 から 1e-10 に増加.
.options reltol=0.003 : 収束基準の許容誤差を 0.0001 から 0.003 に増加.0.003 を超えることは絶対にしてはいけない.
.options cshunt=1e-15 : 各ノードからグランドへ追加される CSHUNT 容量として 1e-15 を追加.高周波振動や数値ノイズによって引き起こされる "Timestep too small" 問題を解決できる.デフォルトは  0 .

「代替ソルバーや cshunt のような機能を必要とする回路には注意が必要です.これは,回路のどこかに不具合がある,つまりモデルに現実離れした部分があることを意味します.」とのこと.

2025年11月20日木曜日

涉过愤怒的海の時計台?

映画 涉过愤怒的海 では漁師の娘,金丽娜は京都大学に留学しているという設定なのだが,この映画で出てくる時計台?がちがくない?という話.


これは京大の時計台ではなくて近大の西門ですね.


スクショは近大のWebから.



ちなみに吉田寮は本物っぽい.京大の許可は取ったのだろうか….

2025年11月4日火曜日

LDAP とローカルで同じユーザー名をつけたら一度ログアウトしましょう,という話

 情けない話なので備忘録.
ローカルで user1 を作成しログインした状態で,同名ユーザーを LDAP で user1 としou=SUDOers となるグループに設定していた.このとき,ユーザー名は同じに見えるのだけれど,user_id がローカルは 1001,LDAP は 10001 となっていたので,「ユーザー名は正しく見えるのにファイル生成で変に permission denied されるぞ」「ユーザー名は正しく見えるのにsudoできないぞ?」という事態が起きていた.
% sudo ls
sudo: あなたは passwd データベースに存在しません

どうやってわかったかというと,id コマンドは認証系 (LDAP) のユーザー名と user_id を表示してくれて,
% id user1
uid=10001(user1) gid=10001(user1) groups=10001(user1),11000(admin),10000(user)

そのシェルで whoami したらローカルでログインした該当 user_id が認証システムにないと言われたためである.
% whoami
whoami: cannot find name for user ID 1001

ls-n オプションをつけるとユーザー名ではなくユーザーIDを表示してくれるのでそれもよいかもしれない.
%ls -l
合計 383M
drwxr-xr-x.  6 user1 user1 4.0K 10月 22 01:43 .
drwxrwxrwx. 83 user1 user1 8.0K 10月 22 06:41 ..
...
drwxr-xr-x. 14 user1 user1 4.0K 10月 21 21:48 zlib-1.2.9
%ls -ln
合計 383M
drwxr-xr-x.  6 10001 10001 4.0K 10月 22 01:43 .
drwxrwxrwx. 83 10001 10001 8.0K 10月 22 06:41 ..
...
drwxr-xr-x. 14 10001 10001 4.0K 10月 21 21:48 zlib-1.2.9

ログアウトしてログインしたら解決したという情けない話であった.とはいえ認証系でおかしい時にログアウトするのは勇気がいるけれど.
(危ない操作をする場合は,タブ1つはログインしっぱなしにしておけとか,違う tty でログインしておけ,とか言っていましたね)

2025年11月3日月曜日

ldappasswd が Invalide credentials (49) を返してくる

 タイトルの通りですが,LDAPのパスワードを変えようと ldappasswd を使うのだが,  
と返されうまくいかない.原因は
(1) 認証に利用しているrootdnが異なる
(2) 認証に利用しているパスワードが異なる,特に平文を使っている場合,それがハッシュ化される時のハッシュ値が実行条件によって変化する
(3) 認証に利用しているパスワードへのアクセス権がない
などがあげられるらしいが,(2) はMD5にしているし,(1),(3) は他の ldap* コマンドは受け付けているので理由が全くわからなくて困ってしまった.

結局初期化はインスタンスごと作り直すことに.
 

こんな感じの Perl スクリプトでユーザーを追加する .ldif を作成.

 

シェルスクリプトで .ldif スクリプトを起動.

 

その後,既存インスタンスの削除,インスタンス生成,LDAP オブジェクトの生成(基本+自分),LDAP オブジェクトの生成( Perl で作った学生分)という感じ.

2025年11月2日日曜日

LinuxMint / AlmaLinux 環境に LDAP を入れる

長年やりたいと思っていた  LDAP/389DirectoryServer をインストールできた.こちらのサイトを大いにコピー参考させていただいた.大変ありがたい.


こちらの環境は以下の通りなので,Server 側は一部読み替えが必要です.
Server:LinuxMint 
Client:AlmaLinux8 

Server側設定

LDAP/389DirectoryServer をインストール

 

生成した .inf の一部を書き換える.

 

インスタンスの生成と動作確認
 
→Activeになっていることを確認

ポート開放

クライアントから接続するためのポートをあける

 
 

sssd.ldif を作成

意識が低いので公開鍵認証ではなくパスフレーズ認証です.元記事にあった公開鍵認証のためのスキーマは読みません.

 

sssd.ldif を読む

 

補足:
   
modify operation type is missing at line 2, entry "ou=Users,dc=example,dc=com"
と表示されてる場合,ldapadd ではなく ldapmodify を実行している.ldapmodify を使う場合は,ldifにどのような変更を行うか記述が必要らしい.


再度実行してみる

 

ldif の情報が登録できたか確認する.
 

クライアント設定

sssdインストール

 

sssd.conf は Quita の記事のほぼそのままです.

 

 

SSSD 起動

 
→Activeになっていることを確認

動作確認
 

ユーザー情報取得

 


認証をSSSDに変更

 

ログインしてみよう.

 

.bashrc が読めていないけれど,ログインもできたしsudoもできた.ようやく使えるようになった.

LDAP初期化

LDAP の設定を初期化する際は消す前に一度止める必要があるらしい.LDAP 設定でおかしいなと思ったら,次の一連のコマンドを実行してまっさらな .inf ファイルから再構築していた.この知識がない段階では,LDAP  がうまくいかなくなったら OS まるごと再インストールしていた.(TATが…)

 

参考

こちらのサイトも参考にはしていたのだけれど,おそらく aci 設定が適切でなくてユーザー情報は引けたがログインには至らなかった.

いつも頼りにしている Server World さんの設定はすごくシンプルなんだがうまくいかない.

OpenLDAP : LDAP サーバーの設定
https://www.server-world.info/query?os=Rocky_Linux_8&p=openldap&f=1
OpenLDAP : LDAP クライアントの設定
https://www.server-world.info/query?os=Rocky_Linux_8&p=openldap&f=3

はまったこと

sssd.ldif に書いたパスワードの末尾に空白があるとパスフレーズ認証が通らない.これは平文でも暗号化していても同じ.これでずっと悩んでいて,うまく行ったりうまく行かなかったりぱっと見の再現性がなくてめっちゃこまっていた.
また /root/ds01.inf の先頭行が空欄になっていたのも問題だったかもしれない.とにかく設定中にエラーなり警告なりが出てくれないので難易度が高すぎる.

追記 (25/11/23)

Ubuntu で同様にセットアップしていたら,sudo 実行時に libsss_sudo.so が無いと言われた.(sudoそのものは正しく動く)

 

これは libsss-sudo を入れればよいらしい.