FPGA
python3
Polyphony

「山が高いからといって、戻ってはならない」という諺があるらしい。Polyphony が登ろうとしている山はどれくらいの高さなのだろう?

MyHDLは Python から HDL を生成するツールだ。歴史も長く、多くのライブラリを持っている。使ってみる。

まずは定番 HelloWorld。iverilog などなくてもシミュレーションできる。その上、Verilog にも VHDL にも変換できるようだ(こっちが本来の目的だろう)。

hello.py
from myhdl import Signal, delay, always, now, Simulation

def HelloWorld():

    interval = delay(10)

    @always(interval)
    def sayHello():
        print("%s Hello World!" % now())

    return sayHello


inst = HelloWorld()
sim = Simulation(inst)
sim.run(30)

LED strobe (いわゆるLチカ)の Tutorialもあるようなので参考にされたい。

Polyphony と大きな違いは何だろうか?変数の扱いはその一つだ。例えば Tutorial の MyHDL の記述の一部は次の通りだ。strobe という信号に注目する。

 @always_seq(clock.posedge, reset=reset)
    def beh_strobe():
        # Generate the strobe event, use the "greater
        # than" for initial condition cases.  Count the
        # number of clock ticks that equals the LED strobe rate
        if clk_cnt >= cnt_max-1:
            clk_cnt.next = 0
            strobe.next = True
        else:
            clk_cnt.next = clk_cnt + 1
            strobe.next = False

strobe というオブジェクトは next を持ち、そこに値を入れる。その値は次のクロックで更新される値であり、すぐに反映されるわけではない。

一方、Polyphony ではどうか?

 def main(self):
        led:bit = 1
        while is_worker_running():
            self.led(led)
            led = ~led
            self._wait()

led という 1bit の変数は代入後、すぐにその値が反映される(ように見える Verilog-HDL コードを生成する)。

MyHDL は従来の HDL を尊重した書き方を重視しており、クロックを考慮した細かい制御が可能だ。その代り、多くの HDL 的な考慮が必要だ。変数の更新タイミングはその一例である。

Polyphony が目指す世界は従来のソフトウェア・コードをハードウェアになじませるにある。クロックはソースコードの後ろに隠れて見えてこない。その分、かゆいところに手が届かない部分もある。そういった部分は直接 Verilog-HDL を書くなり、MyHDL と連携するなりして補完していくことになる。