「山が高いからといって、戻ってはならない」という諺があるらしい。Polyphony が登ろうとしている山はどれくらいの高さなのだろう?
MyHDLは Python から HDL を生成するツールだ。歴史も長く、多くのライブラリを持っている。使ってみる。
まずは定番 HelloWorld。iverilog などなくてもシミュレーションできる。その上、Verilog にも VHDL にも変換できるようだ(こっちが本来の目的だろう)。
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 と連携するなりして補完していくことになる。