Pythonを使ってHDL(Hardware Description Language)記述を組み立てることができるveriloggenというツールを使っているのですが,デコーダのようにcase文をどのように書くのか分からなくて苦労したため,メモとして残しておきます.
decoder.py
from __future__ import absolute_import
from __future__ import print_function
import sys
import os
from veriloggen import *
def mkDecoder():
m = Module('decoder')
indata = m.Input('in', 3)
out = m.OutputReg('out',8)
decCond = []
decCond.append( When(0)(out(0b00000001)) )
decCond.append( When(1)(out(0b00000010)) )
decCond.append( When(2)(out(0b00000100)) )
decCond.append( When(3)(out(0b00001000)) )
decCond.append( When(4)(out(0b00010000)) )
decCond.append( When(5)(out(0b00100000)) )
decCond.append( When(6)(out(0b01000000)) )
decCond.append( When(7)(out(0b10000000)) )
#decCond.append( When()(out(0b10000000)) )
m.Always() (
Case(indata)(
*decCond
)
)
return m
if __name__ == '__main__':
dut = mkDecoder()
verilog = dut.to_verilog(filename='dut.v')
print(verilog)
sim = simulation.Simulator(dut)
rslt = sim.run()
print(rslt)
'When(0)out(0b000000001)'で,「値が0の場合,outという変数(信号)に2進数で00000001を割り当てる」という意味になります.そのような値と代入式の組み合わせをリストdecCondに登録します.今回はコメントアウトしていますが,このリストの最後にのみWhen()とすることで,default文が追加できます.そのあとで,always文の中のCase文で,入力として用いる変数名を指定しています.