|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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_size end_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)
)
|
|