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.py と tests/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.py と tests/test_reference_clock.py を AI に起案させています。
次回は、これまで構築した SimulationHistory を利用して波形やロック挙動を可視化します。