Пакет python myhdl, как создать начальный блок Verilog

Из кода в основном из образца myhdl:

from myhdl import Signal, intbv, delay, always, now, Simulation, toVerilog

__debug = True

def ClkDriver(clk):
    halfPeriod = delay(10)
    @always(halfPeriod)
    def driveClk():
        clk.next = not clk
    return driveClk

def HelloWorld(clk, outs):

    counts = intbv(3)[32:]

    @always(clk.posedge)
    def sayHello():
        outs.next = not outs
        if counts >= 3 - 1:
            counts.next = 0
        else:
            counts.next = counts + 1
        if __debug__:
            print "%s Hello World! outs %s %s" % (
              now(), str(outs), str(outs.next))

    return sayHello

clk = Signal(bool(0))
outs = Signal(intbv(0)[1:])
clkdriver_inst = ClkDriver(clk)
hello_inst = toVerilog(HelloWorld, clk, outs)
sim = Simulation(clkdriver_inst, hello_inst)
sim.run(150)

Я ожидаю, что он сгенерирует программу Verilog, которая содержит блок initial, например:

module HelloWorld(...)
reg [31:0] counts;
initial begin
    counts = 32'h3
end
always @(...

Как вы можете сгенерировать блок initial?

Обратите внимание, что в кеше Google для old.myhdl.org/doku.php/dev:initial_values ​​он ссылается на пример https://bitbucket.org/cfelton/examples/src/tip/ramrom/ . Так что похоже, что функция должна поддерживаться. Однако образец рома генерирует статические операторы case. Это не то, что я ищу.


person minghua    schedule 05.07.2017    source источник
comment
используемая версия myhdl — 0.9.0.   -  person minghua    schedule 05.07.2017
comment
кажется, эта функция не была развернута. github.com/myhdl/myhdl/issues/105   -  person minghua    schedule 05.07.2017


Ответы (1)


Три шага, чтобы решить эту проблему:

  • Обновите myhdl до последней версии на master или версию, содержащую хэш 87784ad, который добавил функцию в проблеме #105 или #150. В качестве примера для virtualenv запустите клон git, а затем pip install -e <path-to-myhdl-dir>.
  • Измените сигнал на список.
  • Установите toVerilog.initial_values=True перед вызовом toVerilog.

Далее следует фрагмент кода.

def HelloWorld(clk, outs):

    counts = [Signal(intbv(3)[32:])]

    @always(clk.posedge)
    def sayHello():
        outs.next = not outs
        if counts[0] >= 3 - 1:
            counts[0].next = 0
        else:
            counts[0].next = counts[0] + 1
        if __debug__:
            print "%s Hello World! outs %s %s %d" % (
                  now(), str(outs), str(outs.next), counts[0])
    return sayHello

clk = Signal(bool(0))
outs = Signal(intbv(0)[1:])
clkdriver_inst = ClkDriver(clk)
toVerilog.initial_values=True
hello_inst = toVerilog(HelloWorld, clk, outs)
sim = Simulation(clkdriver_inst, hello_inst)
sim.run(150)
person minghua    schedule 05.07.2017