mirror of
https://github.com/lleene/hugo-site.git
synced 2025-03-09 21:42:44 +01:00
update on hugo posts
This commit is contained in:
parent
daf108c6db
commit
b28ec4e15a
315
content/posts/2025/analog-verification.md
Normal file
315
content/posts/2025/analog-verification.md
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
---
|
||||||
|
title: "Analogue Verification"
|
||||||
|
date: 2025-02-03T09:52:41+01:00
|
||||||
|
draft: false
|
||||||
|
toc: false
|
||||||
|
images:
|
||||||
|
tags:
|
||||||
|
- circuit-design
|
||||||
|
- methodology
|
||||||
|
- verification
|
||||||
|
- analog-circuits
|
||||||
|
---
|
||||||
|
|
||||||
|
This page briefly discusses aspects for planning and structuring analogue
|
||||||
|
verification and some of the inherent issues related with coverage. Most of
|
||||||
|
the examples will reference Cadence design tools which is common place but
|
||||||
|
alternative with similar flavors exist. This is somewhat specific to analogue
|
||||||
|
simulation that validates design from a functional point of view. This ties in
|
||||||
|
with the construction of the test bench that will probe various aspects of the
|
||||||
|
design to confirm that is operates as expected.
|
||||||
|
|
||||||
|
## Design Sign-Off
|
||||||
|
|
||||||
|
Sign-off for an analogue design could can imply a multitude of things depending
|
||||||
|
its dependency. An exhaustive list of delivery items is shown below. Many of
|
||||||
|
these are only relevant at certain points in the hierarchy but standardizing
|
||||||
|
the flow for creating each item is essential for systematic design. This
|
||||||
|
should allow you develop a check-list automated or manual for certain aspects
|
||||||
|
in each deliverable that ensure quality.
|
||||||
|
|
||||||
|
- Specification Table
|
||||||
|
- Schematic
|
||||||
|
- Spice Netlist ✔
|
||||||
|
- Verilog Netlist ✔
|
||||||
|
- Layout
|
||||||
|
- GDSII ✔
|
||||||
|
- DRC Report ✔
|
||||||
|
- ERC Report ✔
|
||||||
|
- LVS Report ✔
|
||||||
|
- LEF Abstract ✔
|
||||||
|
- Testbench
|
||||||
|
- Design Documentation
|
||||||
|
- Verification Report
|
||||||
|
- Design Review Checklist
|
||||||
|
- Digital Timing Model
|
||||||
|
- Test/Trimming Plan
|
||||||
|
|
||||||
|
Fortunately many of these items (✔) do not necessarily require manual intervention
|
||||||
|
and can for the most part be part of a automated flow that sanity-checks
|
||||||
|
different aspects of the design.
|
||||||
|
|
||||||
|
## Design Flow Automation
|
||||||
|
|
||||||
|
Several components in the industry analogue design flow are illustrated below
|
||||||
|
with their relative association. The verification process only touches a small
|
||||||
|
part in the overall picture but provides key indicators for many other aspects
|
||||||
|
of the design flow such as project planning, lab work, and software development.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
external@{ shape: notch-rect, label: "3rd Party IP" }
|
||||||
|
requirements@{ shape: notch-rect, label: "Design\nRequirements" }
|
||||||
|
design@{ shape: cyl, label: "Cadence\nDesign Database" }
|
||||||
|
reports@{ shape: docs, label: "DRC/ERC/LVS Reports\nCircuit Netlists" }
|
||||||
|
abstracts@{ shape: cyl, label: "GDSII\nLEF/DEF Abstracts" }
|
||||||
|
simulation@{ shape: docs, label: "JSON Database\nVerification Reports\nCircuit Documentation" }
|
||||||
|
labwork@{ shape: docs, label: "Measurement Reports\nRoot-Cause Analysis\n" }
|
||||||
|
webdocs@{ shape: procs, label: "**Documentation Portal**\nUsage Guide\nDesign Theory\netc."}
|
||||||
|
spotfire@{ shape: cyl, label: "Characterization Data"}
|
||||||
|
external ==> design
|
||||||
|
requirements ==> design
|
||||||
|
design == NVAFLOW ==> reports
|
||||||
|
design == NVAFLOW ==> abstracts
|
||||||
|
design == RDBDOC ==> simulation
|
||||||
|
simulation ==> webdocs
|
||||||
|
labwork ==> webdocs
|
||||||
|
```
|
||||||
|
|
||||||
|
Here I have highlighted two integration tools that automate and assist in
|
||||||
|
generating various aspects of the design sign-off. Some of which are not user
|
||||||
|
facing such as GDSII and LVS results which are handled by NVAFLOW and is
|
||||||
|
closely tied to the process-development-kit (PDK). The other tool is RDBDOC
|
||||||
|
which assists parsing the cadence database in order to generate and template
|
||||||
|
reports.
|
||||||
|
|
||||||
|
The point here being is that when we sign-off at top-level it is not unusual
|
||||||
|
for a large number of designs to be incorporated. Each of which should be
|
||||||
|
checked while it is frozen for external delivery. Such a tool can rigorously
|
||||||
|
generate all outputs systematically while also performing a series of sanity
|
||||||
|
checks to grantee design quality.
|
||||||
|
|
||||||
|
## Verification Plan
|
||||||
|
|
||||||
|
Planning analogue verification in a structured manner is challenging primarily
|
||||||
|
because one must often carefully consider what is important when simulating a
|
||||||
|
design. It is very easy to exhaustively simulate without actually gaining
|
||||||
|
confidence in the design.
|
||||||
|
|
||||||
|
Typically one would setup a test bench that checks for both specific
|
||||||
|
performance metrics such as phase-margin in a amplifier and generic performance
|
||||||
|
metric such as off-state leakage. Here is it good practice to have a base-line
|
||||||
|
of checks reflecting best-practices. A few examples of design-agnostic checks:
|
||||||
|
|
||||||
|
- Supply sensitivity
|
||||||
|
- Bias sensitivity
|
||||||
|
- Nominal current
|
||||||
|
- Leakage current
|
||||||
|
- Peak-to-Peak current
|
||||||
|
- Off-state / grounded controls
|
||||||
|
- Assertions for illegal states
|
||||||
|
- Distortion / Linearity
|
||||||
|
- Calibration/Configuration edge cases
|
||||||
|
- Debug coverage
|
||||||
|
- Output/Input impedance
|
||||||
|
|
||||||
|
It is important to keep in mind that these metrics are a baseline for evaluating
|
||||||
|
performance at a distance. One can obviously run a simulation an study the
|
||||||
|
transient waveform in detail but it is usually not feasible to do this over 500+
|
||||||
|
simulation points. This is why it is important to derive metrics for performance
|
||||||
|
that accurately reflect underlying characteristics with one or several numbers
|
||||||
|
that can be judged over corners and montecarlo.
|
||||||
|
|
||||||
|
Now as example a typical verification plan is presented that varies
|
||||||
|
process parameters in order to expose variations and weakness in the design
|
||||||
|
such that we have a good expectation of what post-silicon performance
|
||||||
|
characteristics will look like. This plan is divided into three steps with
|
||||||
|
increasing simulation effort.
|
||||||
|
|
||||||
|
``` markdown
|
||||||
|
This is a baseline where the designer must recognize the best way to stress
|
||||||
|
aspects of the design and adjust the plan accordingly.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Simulation Corners
|
||||||
|
|
||||||
|
Generally there are three aspect to simulation corner definition:
|
||||||
|
Front-End-Of-Line (FEOL), Back-End-Of-Line (BEOL), Voltage+Temperature. These
|
||||||
|
parameters are very closely tied to the process and qualification standard the
|
||||||
|
circuit aims to achieve. Naturally the more demanding our qualification the harder
|
||||||
|
it is to guarantee performance over coreners. For example we can target a
|
||||||
|
temperature range of 0° 70°, -40° 85°, -40° 125° depending if we consider
|
||||||
|
consumer, industrial, or grade-1 automotive qualification in the JEDEC standard.
|
||||||
|
|
||||||
|
We distinguish between FEOL and BEOL because these are two different sets of
|
||||||
|
process parameters that are affected during fabrication that do not correlate
|
||||||
|
with one another. FEOL generally relates to device characteristics such as
|
||||||
|
threshold voltage, off-leakage, transconductance, and current drive while BEOL
|
||||||
|
relates to interconnect and Metal-Oxide-Metal passives such as capacitors and
|
||||||
|
inductors. A process will specify bias for FEOL and BEOL while the designer
|
||||||
|
will specify a bias for temperature and voltage. Together a collection of
|
||||||
|
parameter biases are grouped as corners and used to simulate circuits under
|
||||||
|
various post-silicon conditions.
|
||||||
|
|
||||||
|
FEOL corners will come in a variety of flavors for different purposes and
|
||||||
|
should be studied carefully. Analog circuits are generally not that interested
|
||||||
|
in worst-case leakage corners but a worst-case noise corner maybe available.
|
||||||
|
Analogue is generally interested in FF and SS extremities, sometimes called
|
||||||
|
total corners not to be confused with the global corners FFG and SSG, to if
|
||||||
|
trim ranges and bias ranges are sufficient to meet performance requirements.
|
||||||
|
|
||||||
|
Separately we should study BEOL corners. This is usually somewhat easier as the
|
||||||
|
extremities simply best and worst case capacitance as CWORST/CBEST or best and
|
||||||
|
worst interconnect time-constants as RCBEST/RCWORST. The designer should know
|
||||||
|
which set of extremes is worst. Typically low frequency analogue will suffer
|
||||||
|
most from CWORST/CBEST variation. High freuquency analogue and custom digital
|
||||||
|
may opt to use the RCWORST/RCBEST corners.
|
||||||
|
|
||||||
|
Verification can be planned and separated into three levels of confidence,
|
||||||
|
each with increasing simulation time. It is always advised to select corners
|
||||||
|
to find the best and worst case process conditions for our circuit.
|
||||||
|
|
||||||
|
### Level 1: Corner Simulations
|
||||||
|
|
||||||
|
Level 1 focuses on total corner simulation without montecarlo. The purpose here
|
||||||
|
is to demonstrate a brief overview of passing performance with DFM checks such
|
||||||
|
as EMIR and Aging. There maybe some back-and-forth with the layout and design
|
||||||
|
at this point as verification results are checked.
|
||||||
|
|
||||||
|
| **VT Corner** | **High Voltage** | **Nom. Voltage** | **Low Voltage** |
|
||||||
|
|---------------|------------------|------------------|-----------------|
|
||||||
|
| **High Temp** | | |FF/SS + CBEST/CWORST|
|
||||||
|
| **Nom Temp** | |TT + CBEST/NOM/CWORST| |
|
||||||
|
| **Low Temp** |FF/SS + CBEST/CWORST| | |
|
||||||
|
|
||||||
|
Total Simulations: 11 + EMIR + Aging
|
||||||
|
|
||||||
|
With these preliminary set of results one can pass some judgement over
|
||||||
|
circuit performance during design review. By including the DFM simulations
|
||||||
|
here (i.e. EMIR and Aging) the layout will be relatively close to the final
|
||||||
|
result.
|
||||||
|
|
||||||
|
### Level 2: Montecarlo Simulations
|
||||||
|
|
||||||
|
Level 2 focuses on presenting a typical distribution of performance metrics
|
||||||
|
using montecarlo methods. Here we must make an important choice of which mc
|
||||||
|
corner is used. Generally foundries will recommend to use the global corners:
|
||||||
|
FFG, SSG, FSG, SFG, and only apply local mismatch. This will yield good
|
||||||
|
statistical distributions in our testbench metrics and allow use to make
|
||||||
|
gaussian estimations to limit the number of simulations runs of the same
|
||||||
|
confidence interval opposed to a unknown distribution. A alternative here is
|
||||||
|
to use the typical corner and enable both local and global process variation.
|
||||||
|
|
||||||
|
| **VT Corner** | **High Voltage** | **Nom. Voltage** | **Low Voltage** |
|
||||||
|
|---------------|------------------|------------------|-----------------|
|
||||||
|
| **High Temp** | | |FFG/SSG+CBEST/CWORST|
|
||||||
|
| **Nom Temp** | |TT+CNOM| |
|
||||||
|
| **Low Temp** |FFG/SSG+CBEST/CWORST| | |
|
||||||
|
|
||||||
|
Total Simulations: 225 with 25 mc runs per corner
|
||||||
|
|
||||||
|
### Level 3: Completion
|
||||||
|
|
||||||
|
Level 3 is intended to be the target set of corners used to validate a design
|
||||||
|
across corners using montecarlo methods. This is an exhaustive simulation
|
||||||
|
job and doesn't quite cover all possible scenarios when combining FEOL+BEOL+VT.
|
||||||
|
Generally however it will a good representation of post-silicon results with a
|
||||||
|
high quality testbench.
|
||||||
|
|
||||||
|
| **VT Corner** | **High Voltage** | **Nom. Voltage** | **Low Voltage** |
|
||||||
|
|---------------|------------------|------------------|-----------------|
|
||||||
|
| **High Temp** |FFG/SSG+CBEST/CWORST| |FFG/SSG+CBEST/CWORST|
|
||||||
|
| **Nom Temp** | |FFG/TT/FSG/SFG/SSG+CBEST/CNOM/CWORST| |
|
||||||
|
| **Low Temp** |FFG/SSG+CBEST/CWORST| |FFG/SSG+CBEST/CWORST|
|
||||||
|
|
||||||
|
Total Simulations: 775 + EMIR + Aging with 25 mc runs per corner
|
||||||
|
|
||||||
|
This set of results ultimately feeds into the test program for the device.
|
||||||
|
The distributions can be used to set limits and measurement inferences
|
||||||
|
when binning and sorting fabricated devices.
|
||||||
|
|
||||||
|
## Verification Report
|
||||||
|
|
||||||
|
Reporting on our verification results should provide a overview on what the
|
||||||
|
circuit targets where, where the senstivities lie, and how non-idialities
|
||||||
|
manifest in circuit behavior. Lets discuss a general report structure and
|
||||||
|
provide an example.
|
||||||
|
|
||||||
|
- Design Files
|
||||||
|
- Simulator Setup
|
||||||
|
- Target Specifications
|
||||||
|
- Simulation Parameters
|
||||||
|
- Simulation Notes
|
||||||
|
- Results and Statistical Summary
|
||||||
|
- Distributions
|
||||||
|
- EMIR/Aging Results
|
||||||
|
|
||||||
|
With a ADE result database from Cadence we can export the data using skill
|
||||||
|
and generate a generic database file that can be parsed and post-processed by
|
||||||
|
python. This allows us to make a clean report that need minimal user input
|
||||||
|
while providing a good overview on simulation results external to the Cadence
|
||||||
|
environment. A cut-down version of such a report is detailed below. Notice
|
||||||
|
the designer should still contribute certain annotations to the report such
|
||||||
|
that it is self explanitory.
|
||||||
|
|
||||||
|
> # Verification Summary: MYLIB divider_tb
|
||||||
|
>
|
||||||
|
> lieuwel 2018-01-01
|
||||||
|
>
|
||||||
|
> ## Test Description
|
||||||
|
>
|
||||||
|
> This is a preliminary verification report for the divider circuit
|
||||||
|
> which is a 8-bit reconfigurable clock divider operating on the RF clock
|
||||||
|
> after the 4x clock divider from the counter module. This test bench
|
||||||
|
> is intended to verify correct operation for all divider settings.
|
||||||
|
>
|
||||||
|
> ## Test: Interactive.2:MYLIB_divider_tb_1
|
||||||
|
>
|
||||||
|
> Simulation started on 1st Jan 2018 and ran for 2035 minutes.
|
||||||
|
> The yield for this test is 100% to 100% (1675 of 1675 points passed)
|
||||||
|
> Verification state: 1/3
|
||||||
|
>
|
||||||
|
> ### Design Setup
|
||||||
|
>
|
||||||
|
> Library Name: MYLIB
|
||||||
|
> Cell Name: divider_tb
|
||||||
|
> View Name: schematic
|
||||||
|
> Simulator: spectre
|
||||||
|
>
|
||||||
|
> ### Parameters
|
||||||
|
>
|
||||||
|
> |Name|Expression|Values|
|
||||||
|
> | :---: | :---: | :---: |
|
||||||
|
> |clk_sr|15p|1.5e-11|
|
||||||
|
> |clk_pw|clk_pd/2|3.333333e-10|
|
||||||
|
> |clk_pd|4/6G|6.666667e-10|
|
||||||
|
> |div|0|0:255|
|
||||||
|
> |vdd|1.1|1.045, 1.1, 1.155|
|
||||||
|
>
|
||||||
|
> ### Specifications
|
||||||
|
>
|
||||||
|
> |Output|Specification|Pass/Fail|
|
||||||
|
> | :---: | :---: | :---: |
|
||||||
|
> |EnergyPerCycle|< 1p|Pass|
|
||||||
|
> |div_err|-100m - 100m|Pass|
|
||||||
|
> |div_meas|-|Info|
|
||||||
|
> |dly_out|< 100p|Pass|
|
||||||
|
> |fin|1.5G ±1%|Pass|
|
||||||
|
>
|
||||||
|
> ### Output: EnergyPerCycle
|
||||||
|
>
|
||||||
|
> Sample presents a mixed distribution. Using < 1p as specification requirement.
|
||||||
|
>
|
||||||
|
> |Corner|P0.16|P0.5|P0.84|Pass/Fail|
|
||||||
|
> | :---: | :---: | :---: | :---: | :---: |
|
||||||
|
> |C_BEST_HTHV|193f|193f, 193f|193f, 193f|Pass|
|
||||||
|
> |C_BEST_HTLV|168f|168f, 168f|168f, 168f|Pass|
|
||||||
|
>
|
||||||
|
> {{< figure src="/images/posts/verification/energypercycle-c-best-hthv.png" title="C_BEST_HTHV" width="250" >}}
|
||||||
|
> {{< figure src="/images/posts/verification/energypercycle-c-best-htlv.png" title="C_BEST_HTLV" width="250" >}}
|
||||||
|
>
|
||||||
|
> ## Summary
|
||||||
|
>
|
||||||
|
> Tests pass with good margin
|
||||||
|
>
|
||||||
|
> EMIR - pass (pre-TO)
|
30
content/posts/2025/dynamic-search.md
Normal file
30
content/posts/2025/dynamic-search.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
title: "Single-Bit Heuristics"
|
||||||
|
date: 2025-01-13T12:31:02+01:00
|
||||||
|
draft: true
|
||||||
|
toc: false
|
||||||
|
images:
|
||||||
|
tags:
|
||||||
|
- signal-processing
|
||||||
|
- digital-circuits
|
||||||
|
- python
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
``` goat
|
||||||
|
|
||||||
|
.
|
||||||
|
.-. |\ .-.
|
||||||
|
Vin -->| Σ +--+⨍+------*------->| Σ +--> Digitized Sequence
|
||||||
|
'-' |/ | '-'
|
||||||
|
^- ' v ^
|
||||||
|
| .--------. |
|
||||||
|
| | H(z) | |
|
||||||
|
| '---+----' |
|
||||||
|
| | |
|
||||||
|
'------------*---------'
|
||||||
|
|
||||||
|
```
|
68
content/posts/2025/mixed-signal-simulation.md
Normal file
68
content/posts/2025/mixed-signal-simulation.md
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
title: "Mixed Signal Circuits & Digital Simulation"
|
||||||
|
date: 2025-02-04T10:46:19+01:00
|
||||||
|
draft: false
|
||||||
|
toc: false
|
||||||
|
images:
|
||||||
|
tags:
|
||||||
|
- circuit-design
|
||||||
|
- methodology
|
||||||
|
- verification
|
||||||
|
- mixed-signal
|
||||||
|
---
|
||||||
|
|
||||||
|
These days it is not usual even for "analogue" chips that we perform digital
|
||||||
|
integration at the top-level. This is mainly because the digital integration
|
||||||
|
flow is very well versed in 3rd-party IP integration and providing confidence
|
||||||
|
in the result assuming well defined constraints. Here I will outline a various
|
||||||
|
aspects for co-simulation of hard-macro analogue sub-modules in the digital
|
||||||
|
design flow. Note that in this context full-custom-digital is often also viewed
|
||||||
|
as analogue as from a integration point-of-view they are effectively equivalent.
|
||||||
|
|
||||||
|
## Design Views
|
||||||
|
|
||||||
|
As we progress through the analogue design flow, progressively more of the digital
|
||||||
|
design views can be delivered at each stage. As shown here, first
|
||||||
|
a functional definition can provided with a behavioral model. This can be in
|
||||||
|
the form of a verilog netlist where ports are well defined and the underlying
|
||||||
|
functionality is described using HDL statements. This requires us to discretize
|
||||||
|
aspects of the design and choose what functionality is implemented
|
||||||
|
as the end-goal here is digital integration testing.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
A2(Schematic)
|
||||||
|
A3(Layout)
|
||||||
|
A4(Simulation)
|
||||||
|
A2 --> A3
|
||||||
|
A3 --> A4
|
||||||
|
D1(Verilog Netlist)
|
||||||
|
D2(Abstract View)
|
||||||
|
D3(Timing View)
|
||||||
|
A2 --> D1
|
||||||
|
A3 --> D2
|
||||||
|
A4 --> D3
|
||||||
|
style D1 fill:none, stroke:none
|
||||||
|
style D2 fill:none, stroke:none
|
||||||
|
style D3 fill:none, stroke:none
|
||||||
|
```
|
||||||
|
|
||||||
|
Subsequently an abstract is generated based on the layout. Naturally
|
||||||
|
this is used for floor-planning and place & route tools that realize a physical
|
||||||
|
design. There are some minor nuances here such as pin definition and keep-out
|
||||||
|
areas that will constrain the digital tools. However the key checks are simple:
|
||||||
|
are all pins defined and accessible, and is there sufficient clearance to the
|
||||||
|
boundary to avoid metal spacing violations.
|
||||||
|
|
||||||
|
Finally a timing view can be generated depending on how the underlying circuit
|
||||||
|
is constructed. This process is slightly different when looking at a
|
||||||
|
circuit where we interface directly with custom digital or transistor level
|
||||||
|
elements. It is advisable to avoid this specialized part of the flow because
|
||||||
|
it will require us to resimulate and perform our own characterization of the
|
||||||
|
timing data using Cadence Liberate. If the digital interface is limited to
|
||||||
|
standard-cell we can rely on standard-library defined timing-characterization
|
||||||
|
and the associated digital corners that are used with the rest of the design.
|
||||||
|
|
||||||
|
## Innovus Flow
|
||||||
|
|
||||||
|
## Liberate Flow
|
22
content/posts/2025/source/analysis.ipynb
Normal file
22
content/posts/2025/source/analysis.ipynb
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {
|
||||||
|
"vscode": {
|
||||||
|
"languageId": "plaintext"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"language_info": {
|
||||||
|
"name": "python"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 2
|
||||||
|
}
|
153
content/posts/2025/source/models.py
Normal file
153
content/posts/2025/source/models.py
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
from sympy import Symbol, log, sin
|
||||||
|
from scipy import constants
|
||||||
|
from quantiphy import Quantity
|
||||||
|
import control as ct
|
||||||
|
|
||||||
|
eval_constants = {
|
||||||
|
"k": constants.k, # Boltzmann contant
|
||||||
|
"T": constants.convert_temperature(25.0, "Celsius", "Kelvin"),
|
||||||
|
"q": constants.e, # Elementary charge
|
||||||
|
}
|
||||||
|
|
||||||
|
_pi = constants.pi
|
||||||
|
_kT = constants.Boltzmann * constants.convert_temperature(25.0, "Celsius", "Kelvin")
|
||||||
|
|
||||||
|
|
||||||
|
class Crystal:
|
||||||
|
def __init__(self, frequency: float = 4.8e7, noise_floor_dBc: float = -160):
|
||||||
|
self.frequency = frequency
|
||||||
|
self.noise_floor_dBc = noise_floor_dBc
|
||||||
|
## TODO low-frequency jitter offset contribution
|
||||||
|
|
||||||
|
def xtal_jitter(self, bandwidth, ref_frequency):
|
||||||
|
"""XTAL jitter estimate over bandwidth"""
|
||||||
|
return Quantity(
|
||||||
|
(
|
||||||
|
2
|
||||||
|
* 10 ** (self.noise_floor_dBc / 10)
|
||||||
|
* bandwidth
|
||||||
|
/ (ref_frequency * 2 * _pi) ** 2
|
||||||
|
)
|
||||||
|
** 0.5,
|
||||||
|
units="s_rms",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Oscillator:
|
||||||
|
"""
|
||||||
|
VCO Phase-Noise Model of LC Oscillator
|
||||||
|
|
||||||
|
Bandwidth upper limit is set by the refence clock
|
||||||
|
Back off by 10x in sampled systems for stability
|
||||||
|
More accurately take xtal into account and equate jitter
|
||||||
|
|
||||||
|
Reference B. Razavi, "Jitter-Power Trade-Offs in PLLs,"
|
||||||
|
in IEEE Transactions on Circuits and Systems I: Regular Papers,
|
||||||
|
vol. 68, no. 4, pp. 1381-1387, April 2021, doi: 10.1109/TCSI.2021.3057580.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
f_center: float = 5e9,
|
||||||
|
vout_max: float = 1.0,
|
||||||
|
ibias: float = 5.0e-3,
|
||||||
|
q_factor: float = 10,
|
||||||
|
eta: float = 2.4, # noise excess factor (1+gamma)
|
||||||
|
):
|
||||||
|
self.R = _pi * vout_max / ibias / 2
|
||||||
|
self.f_center = f_center
|
||||||
|
self.vout_max = vout_max
|
||||||
|
self.q_factor = q_factor
|
||||||
|
self.ibias = ibias
|
||||||
|
self.eta = eta
|
||||||
|
|
||||||
|
@property
|
||||||
|
def vco_alpha(self):
|
||||||
|
"""Oscillator Noise Figure alpha"""
|
||||||
|
return (
|
||||||
|
_kT / (self.q_factor**2) * self.eta * (_pi / self.ibias) ** 2 / self.R / 8
|
||||||
|
)
|
||||||
|
|
||||||
|
def pll_phase_noise(self, pll_bandwidth):
|
||||||
|
"""Estimate on a LC oscillator phase-noise as alpha/f**2"""
|
||||||
|
return self.vco_alpha * (self.f_center / pll_bandwidth) ** 2
|
||||||
|
|
||||||
|
def pll_jitter(self, pll_bandwidth, ref_frequency):
|
||||||
|
"""PLL jitter estimate due to VCO"""
|
||||||
|
return Quantity(
|
||||||
|
(
|
||||||
|
4
|
||||||
|
* self.pll_phase_noise(pll_bandwidth)
|
||||||
|
* pll_bandwidth
|
||||||
|
/ (ref_frequency * 2 * _pi) ** 2
|
||||||
|
)
|
||||||
|
** 0.5,
|
||||||
|
units="s_rms",
|
||||||
|
)
|
||||||
|
|
||||||
|
def opt_bandwidth(self, ref_xtal: Crystal):
|
||||||
|
"""Optimal PLL bandwidth for matching reference noise."""
|
||||||
|
f_ratio = self.f_center / ref_xtal.frequency
|
||||||
|
eff_ref_noise = 2 * 10 ** (ref_xtal.noise_floor_dBc / 10) * f_ratio**2
|
||||||
|
return Quantity(
|
||||||
|
(4 * self.vco_alpha * self.f_center**2 / _pi / eff_ref_noise) ** 0.5,
|
||||||
|
units="Hz",
|
||||||
|
)
|
||||||
|
|
||||||
|
def jitter_tol(self, adc_tol_db: float, adc_resolution: float, adc_clock: float):
|
||||||
|
"""Jitter tolerance calculation for m-dB penalty in ADC performance"""
|
||||||
|
return Quantity(
|
||||||
|
(
|
||||||
|
(10 ** (adc_tol_db / 10) - 1)
|
||||||
|
/ (3 * _pi**2 * adc_clock**2 * 2 ** (2 * adc_resolution - 1))
|
||||||
|
)
|
||||||
|
** 0.5,
|
||||||
|
units="s_rms",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# LC Tank Parameter Selection
|
||||||
|
# E. Hegazi, H. Sjoland and A. A. Abidi,
|
||||||
|
# "A filtering technique to lower LC oscillator phase noise,"
|
||||||
|
# in IEEE Journal of Solid-State Circuits,
|
||||||
|
# vol. 36, no. 12, pp. 1921-1930, Dec. 2001, doi: 10.1109/4.972142
|
||||||
|
# A. Mazzanti and P. Andreani,
|
||||||
|
# "Class-C Harmonic CMOS VCOs, With a General Result on Phase Noise,"
|
||||||
|
# in IEEE Journal of Solid-State Circuits,
|
||||||
|
# vol. 43, no. 12, pp. 2716-2729, Dec. 2008,
|
||||||
|
|
||||||
|
|
||||||
|
class Divider:
|
||||||
|
# Error-Feedback Topology
|
||||||
|
# https://www.youtube.com/watch?v=t1TY-D95CY8&t=4373s
|
||||||
|
|
||||||
|
ω = Symbol("ω")
|
||||||
|
|
||||||
|
def __init__(self, order: int = 2, fb_int:int = 100, fb_frac:float = 0.1337):
|
||||||
|
self.fb_int = fb_int
|
||||||
|
self.fb_frac = fb_frac
|
||||||
|
self.order = order
|
||||||
|
|
||||||
|
@property
|
||||||
|
def noise_function_approx(self):
|
||||||
|
return (_pi / 3 / self.ω) ** self.order
|
||||||
|
|
||||||
|
@property
|
||||||
|
def noise_function_exact(self):
|
||||||
|
return (2 * sin(self.ω / 2)) ** self.order
|
||||||
|
|
||||||
|
@property
|
||||||
|
def psd_out(self):
|
||||||
|
return self.noise_function_exact**2 / 12
|
||||||
|
|
||||||
|
@property
|
||||||
|
def modulator_c2p(self):
|
||||||
|
return ct.tf([0,1],[1,-1],dt=True)*(2*_pi/(self.fb_int+self.fb_frac))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pll_ntf(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@property
|
||||||
|
def modulator_response_ss(self):
|
||||||
|
return ct.tf2ss(self.modulator_c2p) * ct.tf2ss(self.pll_ntf)
|
BIN
static/images/posts/verification/energypercycle-c-best-hthv.png
Normal file
BIN
static/images/posts/verification/energypercycle-c-best-hthv.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
BIN
static/images/posts/verification/energypercycle-c-best-htlv.png
Normal file
BIN
static/images/posts/verification/energypercycle-c-best-htlv.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
Loading…
x
Reference in New Issue
Block a user