1

2 つの既存の D-FF で構築されたシンクロナイザーと共にテストベンチを実行すると、このエラーが発生しました。

File "/home/runner/design.py", line 28, in Sync
    @always_seq(clk.posedge, reset=reset)
  File "/usr/share/myhdl-0.8/lib/python/myhdl/_always_seq.py", line 76, in _always_seq_decorator
    raise AlwaysSeqError(_error.ArgType)
myhdl.AlwaysError: decorated object should be a classic (non-generator) function

私のテストベンチは次のように概説されています

from myhdl import *
from random import randrange

HALF_PERIOD = delay(10)   ### This makes a 20-ns clock signal
ACTIVE_HIGH = 1
G_DELAY = delay(15)

def Main():
### Signal declaration
    clk, d, dout = [Signal(intbv(0)) for i in range(3)]
    reset = ResetSignal(1,active=ACTIVE_HIGH,async=True)


### Module Instantiation

    S1 = Sync(dout, d, clk,reset)

### Clk generator

    @always(HALF_PERIOD)
    def ClkGen():
        clk.next = not clk


### TB def
    @instance
    def Driver():
        yield(HALF_PERIOD)
        reset.next = 0
        for i in range(4):
            yield(G_DELAY)
            d.next = not d 
        raise StopSimulation 

    return ClkGen, Driver, S1

m1 = traceSignals(Main)
sim = Simulation(m1)
sim.run()

私のシンクロナイザーは次のようにコーディングされています。

from myhdl import *
from DFF import *

def Sync(dout,din,clk,reset):

    """ The module consists of two FFs with one internal signal

    External signals 

    dout : output
    din  : input
    clk  : input

    Internal signal:

    F2F : output-to-input signal that connects two FFs together

    """
### Connectivity

    F2F = Signal(intbv(0))

    F1 = DFF(F2F,din,clk,reset)  
    F2 = DFF(dout,F2F,clk,reset)

### Function

    @always_seq(clk.posedge,reset=reset)
    def SyncLogic():
        if reset:
            F2F.next = 0
            dout.next = 0
        else:
        F2F.next = din
        yield(WIRE_DELAY)
        dout.next = F2F
    return SyncLogic

FF プロトタイプは次のようにコーディングされます。

from myhdl import *

def DFF(dout,din,clk,reset):

    @always_seq(clk.posedge, reset=reset)
    def Flogic():
        if reset:
            dout.next = 0
        else:
            dout.next = din
    return Flogic

テストベンチは、以前にコーディングした同様のテストベンチ (わずかな変更を加えたもの) で動作しましたが、2 つのモジュールを組み合わせた場合は動作しませんでした。どうか明らかにしてください。ありがとうございました。

4

1 に答える 1

0

ワイヤ遅延をモデル化するには、信号で「遅延」引数を使用します。

変化する

@always_seq(clk.posedge,reset=reset)
def SyncLogic():
    if reset:
        F2F.next = 0
        dout.next = 0
    else:
    F2F.next = din
    yield(WIRE_DELAY)
    dout.next = F2F
return SyncLogic

に:

dout = Signal(<type>, delay=WIRE_DELAY)
# ...
@always_seq(clk.posedge, reset=reset)
def synclogic():
    dout.next = din

「always_seq」では、リセットを定義しません (自動的に追加されます)。明示的にリセットを定義したい場合は、"@always(clock.posedge, reset.negedge)" を使用します。

于 2014-06-20T18:36:33.517 に答える