在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 376|回复: 6

[原创] 不用手动测量Jitter,通过ocean直接得出

[复制链接]
发表于 2025-2-19 17:15:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 Suk_Zhang 于 2025-2-19 17:17 编辑

已知:
我现在要使用ocean脚本帮我去处理一段tran仿真得到的波形图,来直接得出jitter。
我把我的需求给AI,AI给了我代码,但运行结果不对,估计是AI对于cadence内置函数还不了解,请各位高手指点


需求:
我的波形是30ns,我只想截取10ns-30ns作为有用波形。
对有用波形,我想要每10ps一截取,然后将截取的这么多段重叠在一起,这时候我得到的应该是(30ns-10ns)/10ps 段重合在一起的10ps波形。
接下来我要将最终这10ps波形进行数据测量,我要测量出y=0的所有横坐标值,并且求出(目标横坐标最大值-最小值),即为jitter。

步骤:
  • 截取10ns到30ns的波形。
  • 生成多个10ps的窗口,从10ns开始,每次增加10ps,直到30ns - 10ps。
  • 对每个窗口截取波形段,调整时间轴为0到10ps。
  • 合并所有调整后的波形段。
  • 测量合并后的波形中y=0的所有横坐标值。
  • 计算这些横坐标的最大值和最小值的差值。
  • 将参数设为变量,放在ocean脚本顶部,因为ocean运行是按顺序逐行运行,所以参数设置要在顶部。

[color=rgba(0, 0, 0, 0.6)]


脚本实现: AI生成的代码


;;; ===== 用户可调参数区域 ===== ;;;
start_time  = 10e-9    ; 截取起始时间(10ns)
end_time    = 30e-9    ; 截取结束时间(30ns)
step_size   = 10e-12   ; 分段步长(10ps)
y_target    = 0        ; 目标Y轴值
out_file    = "./crossing_analysis.txt" ; 输出文件路径
signal_name = "vout"   ; TRAN仿真信号名称
;;; =========================== ;;;

;; 加载瞬态仿真波形
wave = vt(signal_name)

;; 截取有效波形段
valid_wave = clip(wave start_time end_time)

;; 生成所有分段起始时间点
t_starts = start_time:step_sizeend_time - step_size)

;; 初始化交叉点存储列表
crossing_points = nil

;; 主处理循环
foreach(t_start t_starts
    ;; 截取当前时间窗口
    sub_wave = clip(valid_wave t_start (t_start + step_size))
   
    ;; 转换为相对时间坐标系
    rel_time = sub_wave->time - t_start
    rel_wave = new_wave(rel_time sub_wave->value)
   
    ;; 查找交叉点(包含上升沿和下降沿)
    if crossings = cross(rel_wave y_target 1 "either" nil nil nil) then
        crossing_points = append(crossing_points crossings)
    )
)

;; 结果处理与输出
if crossing_points then
    ;; 计算统计指标
    min_val = apply('min crossing_points)
    max_val = apply('max crossing_points)
    time_diff = max_val - min_val
   
    ;; 创建输出文件
    out_f = outfile(out_file "w")
   
    ;; 写入报告头
    fprintf(out_f "==== 波形交叉点分析报告 ====\n")
    fprintf(out_f "分析时间范围:%.2f ns - %.2f ns\n" start_time*1e9 end_time*1e9)
    fprintf(out_f "分段步长:%.2f ps\n" step_size*1e12)
    fprintf(out_f "目标Y值:%.2f V\n\n" y_target)
   
    ;; 写入原始数据
    fprintf(out_f "=== 所有交叉点相对时间 ===\n")
    foreach(point crossing_points
        fprintf(out_f "%.4f ps\n" point*1e12)
    )
   
    ;; 写入统计结果
    fprintf(out_f "\n=== 统计结果 ===\n")
    fprintf(out_f "最早交叉点:%.4f ps\n" min_val*1e12)
    fprintf(out_f "最晚交叉点:%.4f ps\n" max_val*1e12)
    fprintf(out_f "时间差值:%.4f ps\n" time_diff*1e12)
   
    close(out_f)
    printf("分析完成!结果已保存至:%s\n" out_file)
else
    printf("警告:未找到任何Y=%.2f的交叉点!\n" y_target)
)



发表于 2025-2-19 19:07:07 | 显示全部楼层
只是统计,没看到计算jitter的环节?
 楼主| 发表于 2025-2-20 13:41:28 | 显示全部楼层


appler79 发表于 2025-2-19 19:07
只是统计,没看到计算jitter的环节?


倒数第7行 时间差值的结果就是jitter
发表于 2025-2-20 13:55:00 | 显示全部楼层
为什么要这么搞呢,calculator里面有现成写好的函数的啊
 楼主| 发表于 2025-2-20 16:56:45 | 显示全部楼层


tanborui123 发表于 2025-2-20 13:55
为什么要这么搞呢,calculator里面有现成写好的函数的啊


我没有发现目前已有的jitter函数能实现
发表于 2025-2-20 17:09:51 | 显示全部楼层


Suk_Zhang 发表于 2025-2-20 16:56
我没有发现目前已有的jitter函数能实现


你说的这个abs_jitter函数就这功能啊。。。。
发表于 2025-2-21 10:09:50 | 显示全部楼层


Suk_Zhang 发表于 2025-2-20 13:41
倒数第7行 时间差值的结果就是jitter


就是说time_diff的计算看着不对吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-3-26 16:26 , Processed in 0.021960 second(s), 6 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表