0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python を使った PLL/DLL 設計手法(12)

0
Posted at

OpenSUSI-MPW

Open-Source TR-1um を使った OpenSUSI-MPW サービスを使って「何か本格的に設計したいなぁ」と考えていたのですが、折角なら Open-Source Tool を活用するリファレンス設計としてのドキュメント記録も残したいと思い始めました。そこで、1999 年にT社からザ○○に転職した頃、トップダウン設計の重要性をエンジニアメンバーと会社幹部にデモする目的でスクラッチから独自開発した 「Octave での PLL 設計手法」 を現代に焼き直して 「Python での PLL/DLL 設計手法」 として公開することにします。

第12回は 「Reference Clock #11」 を進めます。

#1  Project Foundation       ✓
#2  Simulation Architecture  ✓
#3  Parameter Definition     ✓
#4  Simulation State         ✓
#5  Event Simulation Engine  ✓
#6  Ideal Delay Model        ✓
#7  Ideal Phase Detector     ✓
#8  Ideal Loop Controller    ✓
#9  Lock Detector            ✓
#10 Simulation History       ✓
#11 Reference Clock          ✓
---
#12 Visualization

役割

Reference Clock はシミュレーション全体の時間基準を生成するコンポーネントです。

今回は、dll/reference_clock.pytests/test_reference_clock.py を作成します。

dll/reference_clock.py

"""
reference_clock.py
"""

from dll.params import DLLParams


class ReferenceClock:

    def __init__(
        self,
        params: DLLParams,
    ):

        self.t_ref = (
            params.clock.t_ref
        )

    def update(
        self,
        cycle: int,
    ) -> float:

        return (
            cycle
            * self.t_ref
        )

simulator.py の変更

from dll.reference_clock import ReferenceClock

を追加

self.reference_clock = ReferenceClock(
    params
)

self.reference_clock = ReferenceClock(params)

__init__() に追加。

さらに

state.ref_edge_time = (
    self.reference_clock.update(
        state.cycle
    )
)

に変更します。

tests/test_reference_clock.py

Test Specification
test_create_reference_clock() ReferenceClockを生成できる
test_cycle_zero() Cycle=0では0秒を返す
test_cycle_one() Cycle=1では1周期後を返す
test_multiple_cycles() 任意のCycleに対して cycle × t_ref を返す
test_repeatability() 同じCycleでは常に同じ値を返す
test_params_are_not_modified() DLLParamsを変更しない
"""
test_reference_clock.py
"""

from dll.params import DLLParams
from dll.reference_clock import ReferenceClock


#
# ============================================================
# Test Helper
# ============================================================
#

def create_clock() -> ReferenceClock:

    params = DLLParams.default()

    return ReferenceClock(
        params
    )


#
# ============================================================
# Constructor
# ============================================================
#

def test_create_reference_clock():

    clock = create_clock()

    assert isinstance(
        clock,
        ReferenceClock,
    )


#
# ============================================================
# Cycle Zero
# ============================================================
#

def test_cycle_zero():

    params = DLLParams.default()

    clock = ReferenceClock(
        params
    )

    assert (
        clock.update(0)
        == 0.0
    )


#
# ============================================================
# Cycle One
# ============================================================
#

def test_cycle_one():

    params = DLLParams.default()

    clock = ReferenceClock(
        params
    )

    assert (
        clock.update(1)
        == params.clock.t_ref
    )


#
# ============================================================
# Multiple Cycles
# ============================================================
#

def test_multiple_cycles():

    params = DLLParams.default()

    clock = ReferenceClock(
        params
    )

    for cycle in range(10):

        assert (
            clock.update(cycle)
            == cycle * params.clock.t_ref
        )


#
# ============================================================
# Repeatability
# ============================================================
#

def test_repeatability():

    clock = create_clock()

    value1 = clock.update(7)

    value2 = clock.update(7)

    assert value1 == value2


#
# ============================================================
# Parameters Are Not Modified
# ============================================================
#

def test_params_are_not_modified():

    params = DLLParams.default()

    original = (
        params.clock.t_ref,
    )

    clock = ReferenceClock(
        params
    )

    for cycle in range(10):

        clock.update(
            cycle
        )

    current = (
        params.clock.t_ref,
    )

    assert current == original

pytest の実行

 python -m pytest
======================================================= test session starts =======================================================
platform darwin -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0
rootdir: /Users/okamura/Dropbox/98_LSI_Design/DLL_TopDown
collected 71 items                                                                                                                

tests/test_controller.py .........                                                                                          [ 12%]
tests/test_delay_model.py ........                                                                                          [ 23%]
tests/test_history.py .........                                                                                             [ 36%]
tests/test_lock_detector.py ...........                                                                                     [ 52%]
tests/test_params.py ..........                                                                                             [ 66%]
tests/test_phase_detector.py ......                                                                                         [ 74%]
tests/test_reference_clock.py ......                                                                                        [ 83%]
tests/test_simulator.py ........                                                                                            [ 94%]
tests/test_state.py ....                                                                                                    [100%]

======================================================= 71 passed in 0.03s ========================================================

まとめ

今回は、dll/reference_clock.pytests/test_reference_clock.py を AI に起案させています。

次回は、これまで構築した SimulationHistory を利用して波形やロック挙動を可視化します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?