HOME
🎄 18日目 Hardware Description Language Advent Calendar 2025
@pgate1

わたしがNSLに慣れるわけないじゃん、ムリムリ!(※ムリじゃなかった!?)

最終更新日 2025年12月18日 投稿日 2025年12月18日

HDLとか、ぜったいにムリ!

こんにちは冬の日差しがまぶしいRN子です!

最近、新しいグループに入ってFPGAデビューするために、 とりあえず論理回路とかコンピュータアーキテクチャとかディジタル信号処理とかの講義は取ったんだけど、 やばい、マジでやばい、みんなの話題がころころ変わってついてけなくて、 FPGAといえばよく「並列に動く回路をHDLで書く」といううわさは聞いてて、 それからVHDLやVerilogの演習を受けた人たちがめげている様子をはたから見てて、 わたしにやれるの?と思ってます…。いやムリ!

とりあえずカウンタや状態遷移の書き方試して、 なんとなくSDRAMコントローラを作ってみようとしたんだけど、 なかなかFPGAで動かなくて。 困るのは、仕様はプログラミングみたいに順次動作が書いてあるけど、 これを並列に動く回路に書き換えるところで脳みその変なところを使っているような感じがして難しくて、 あと、いちいちリセットやクロックを書いたり、さんざんbeginとendでくくったりするのが地味に面倒! もうムリ!

そんな感じで見事にHDLに翻弄され疲れて屋上で休んでたら完全無欠のM1が 「脈は無さそうでもないな…。ある日はVerilog、ある日はNSL、そうやって交互に試してみるというのはどうだい?」って迫ってきて…。 いやムリでしょムリ~!

初めてのNSLなんて、ムリ!

NSLってなに…?とりあえずチャッピーさんに聞いてみる。VHDLやVerilogと違うの?
そういえば高位合成ってのは図書室にあったFPGAマガジンに書いてあったけど、 NSLだとソフトウェアみたいな書き方ができるってこと? NSLを使うとしたらどうすればいいんだろ?

ムリヤリ環境構築なんて、だめムリ!

NSLで検索しても分かりやすい情報が見つからなくて、 とりあえずチャッピーさんに聞いてみる。NSLを使うにはどうすればいい!?
「NSL HDL」とか「NSL FPGA」とかで検索したらいろいろ出てきた! 使ってみた記事もいくつか。 NSLでCPUを作る本も出てる。
🔗FPGAでCPUを作ろう 〜FPGAで、あなたも自分がデザインしたコンピュータを動かせる〜
nsl2vl を使うためのインストールはこんな感じでよさそう。

$ wget https://www.overtone.co.jp/files/nslcore-x86_64-linux-20250428-101.tar.gz
$ mkdir nslcore && tar zxf nslcore-x86_64-linux-20250428-101.tar.gz -C nslcore
$ sudo cp nslcore/linux/x86_64/* /usr/local/bin
$ nsl2vl

OPTIONS:
  INPUT CONTROLS
    ...

SDRAMコントローラなんて、やっぱりムリ!

試しにSDRAMコントローラを書いてみる! …の前に他の人のVerilogをちょっとのぞき見。 いやがっつり見ておくか。

Verilogだと一つのalwaysに各コマンドの各出力が書いてある感じなのかな。 これとか sdram_controller.v あとこれも sdram-controller.v アイドルが書いたり読んだりしてる…?(以下抜粋)

sdram_controller.v
always @*
begin
   if (state == IDLE)
   else
      if (!state_cnt)
        case (state)

          // INIT処理(省略)
          INIT_NOP1:
            ...

          // REFRESH処理(省略)
          REF_PRE:
            ...

          // WRITE
          WRIT_ACT:
            begin
            next = WRIT_NOP1;
            state_cnt_nxt = 4'd1;
            end
          WRIT_NOP1:
            begin
            next = WRIT_CAS;
            command_nxt = CMD_WRIT;
            end
          WRIT_CAS:
            begin
            next = WRIT_NOP2;
            state_cnt_nxt = 4'd1;
            end

          // READ
          READ_ACT:
            begin
            next = READ_NOP1;
            state_cnt_nxt = 4'd1;
            end
          READ_NOP1:
            begin
            next = READ_CAS;
            command_nxt = CMD_READ;
            end
          READ_CAS:
            begin
            next = READ_NOP2;
            state_cnt_nxt = 4'd1;
            end
          READ_NOP2:
            begin
            next = READ_READ;
            end

          default:
            begin
            next = IDLE;
            end
        endcase
      else
        begin
        next = state;
        end
end
NSLだとinit,write,read,refreshそれぞれの機能別に書くことができた (以下 sdram16_ctrl.nsl から抜粋)。 ただ、refreshと同時に動くとまずいからそこは気を付けないと。
sdram16_ctrl.nsl
	func write write_proc(adrs, din);

	proc write_proc seq{
		label_name ACT;
		ACT: if(~refresh){
			com_ACT();
			BA_reg := adrs_reg[21:20];
			A_reg := adrs_reg[19:8];
			DEn_reg := 0b0;
		} else goto ACT;
		{
			com_WRITE();
			A_reg := {0b0100, adrs_reg[7:0]}; // Auto Precharge
		}
		{
			com_NOP();
			DEn_reg := 0b1;
			finish;
		}
	}

	func read read_proc(adrs);

	proc read_proc seq{
		label_name ACT;
		ACT: if(~refresh){
			com_ACT();
			BA_reg := adrs_reg[21:20];
			A_reg := adrs_reg[19:8];
		} else goto ACT;
		{
			com_READ();
			A_reg := {0b0100, adrs_reg[7:0]}; // Auto Precharge
		}
		com_NOP();
		com_NOP();
		{
			dout_reg := Dout;
			finish;
		}
	}

NSLからVerilogへの変換は一瞬。 最適化できるらしい-O2を入れてみる。

renako@ubuntu-desktop:~/nsl_test$ nsl2vl sdram16_ctrl.nsl -O2
nslpp.exe   sdram16_ctrl.nsl | nslc.exe  -O2 -o sdram16_ctrl.v
NSL CORE (version=20250428, build=101)
 Copyright (c) 2002-2025 IP ARCH, Inc. Naohiko Shimizu
 All rights reserved.
No License file found
Licensed to evaluation user without license file.
You are allowed to compile up to 2000 lines or statements
 You are EVALUATION USER

renako@ubuntu-desktop:~/nsl_test$ verilator --lint-only sdram16_ctrl.v --quiet-stats
renako@ubuntu-desktop:~/nsl_test$
生成されたVerilogをVerilatorでリントチェックしてみたけど警告も出なかった。 ほっ…いや安心するのはFPGAで動いてからで。

完全に理解するなんて、ムリムリ!

これでNSLを使う準備が整ったっぽい?わたしは今、自由だ…なんでも作れる気がする! あとはリントチェックしてシミュレーションしてピンアサインしてコンパイルかけてる間に笑顔の練習して、 なぜかお弁当箱の中に春ごろから眠らせてるFPGAボードで動けばわたしも晴れてFPGAデビュー!!

…っていう感じで使ってみたんだけどどうかなってM1に見せてみたら…、だ。 「なんてことはなかっただろう?RN子ならすぐ慣れると思ったよ」 なんて言って誰からも否定されたことのないような目でまっすぐこっちを向いて、 いやいやこの人もピンと来てないけど見つめられても何にも出ないですよ…?

兎にも角にも、こうしてわたしとNSLの戦いが幕を開けたのだった!!

ref. わたしが恋人になれるわけないじゃん、ムリムリ!(※ムリじゃなかった!?)
©2025 pgate1