许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  基于HFSS脚本的集成电路设计仿真(2):全自动参数扫描

基于HFSS脚本的集成电路设计仿真(2):全自动参数扫描

阅读数 6
点赞 0
article_banner

【简介】HFSS在射频集成电路设计起到了至关重要的作用,堪称射频集成电路工程师的左膀右臂。上篇文章中介绍了如何用Python对简单片上电感进行建模和仿真。

本篇文章,将在上篇文章的基础上,介绍如何进行参数扫描和SP文件的批量化自动导出。

1. 背景

在进行射频集成电路HFSS设计时,我们需要反复调节电磁结构的几何参数,并输出所对应的SP文件,再导入cadence或者ADS 中进行仿真。这种重复性的工作非常低效,于是研究了如何用代码去完成这类工作。读者可以直接拷贝、复用下列代码。

2. 简单片上电感

  • 在上篇文章中,我们通过脚本创建了如下的简单电感。其几何结构如下所示。该结构具有四个几何参数:L,Lg,W,和D。
  • 我们希望做如下参数扫描
变量名 Min Max Step
L 80 um 120 um 10 um
Lg 15 um 25 um 5 um
W 4 um 8 um 2 um
  • 并按照“IND_L_Lg_W”的命名方式输出SP文件

3. SP文件导出

在文章(1)所示代码的基础上,我们可以进行SP文件导出

  • 生成频率数组freq_arr

频率起始值为1GHz,截止值为5GHz,频率点数为401

freq_start = 1e9
freq_stop  = 5e9
freq_num   = 401
freq_step  = (freq_stop - freq_start)/(freq_num - 1)

freq_arr = [None] * 0

for i in range(freq_num):
	freq_arr.append(i * freq_step + freq_start)
  • 导出数据
oModule = oDesign.GetModule("Solutions")
oModule.ExportNetworkData("D=\'10um\' L=\'100um\' Lg=\'20um\' W=\'6um\'", ["Setup1:Sweep"], 3, "tutorial_Design1.s1p", freq_arr, True, 50, "S", -1, 0, 15, True, True, False)

4. 参数扫描

以Lg为例,展示如何进行参数扫描

  • 先改变Lg的值
  • 再运行仿真
for i in range(3):
	Lg = str(i * 5 + 15) + "um"
	oDesign.ChangeProperty(
	[
		"NAME:AllTabs",
		[
			"NAME:LocalVariableTab",
			[
				"NAME:PropServers", 
				"LocalVariables"
			],
			[
				"NAME:ChangedProps",
				[
					"NAME:Lg",
					"Value:="		, Lg
				]
			]
		]
	])	
	oDesign.Analyze("Setup1 : Sweep")

5. 最终代码

将上述二者合并后,我们可以得出下列代码

import ScriptEnv

ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.SetActiveProject("tutorial")
oDesign = oProject.SetActiveDesign("Design1")

freq_start = 1e9
freq_stop  = 5e9
freq_num   = 401
freq_step  = (freq_stop - freq_start)/(freq_num - 1)

freq_arr = [None] * 0

for i in range(freq_num):
	freq_arr.append(i * freq_step + freq_start)


for i in range(5):
	L = str(i * 10 + 80) + "um"
	oDesign.ChangeProperty(
	[
		"NAME:AllTabs",
		[
			"NAME:LocalVariableTab",
			[
				"NAME:PropServers", 
				"LocalVariables"
			],
			[
				"NAME:ChangedProps",
				[
					"NAME:L",
					"Value:="		, L
				]
			]
		]
	])		

	for j in range(3):
		Lg = str(j * 5 + 15) + "um"
		oDesign.ChangeProperty(
		[
			"NAME:AllTabs",
			[
				"NAME:LocalVariableTab",
				[
					"NAME:PropServers", 
					"LocalVariables"
				],
				[
					"NAME:ChangedProps",
					[
						"NAME:Lg",
						"Value:="		, Lg
					]
				]
			]
		])	

		for k in range(3):
			W = str(k * 2 + 4) + "um"
			oDesign.ChangeProperty(
			[
				"NAME:AllTabs",
				[
					"NAME:LocalVariableTab",
					[
						"NAME:PropServers", 
						"LocalVariables"
					],
					[
						"NAME:ChangedProps",
						[
							"NAME:W",
							"Value:="		, W
						]
					]
				]
			])
	
			oDesign.Analyze("Setup1 : Sweep")

                	solution_name = "D=\'10um\'L=\'" + L + "\' Lg=\'" + Lg + "\' W=\'" + W + "\'"
                	file_name = "IND_"+L+"_"+Lg+"_"+W+".s1p"
			oModule = oDesign.GetModule("Solutions")
			oModule.ExportNetworkData(solution_name, ["Setup1:Sweep"], 3, file_name, freq_arr, True, 50, "S", -1, 0, 15, True, True, False)

其中要注意两点:

  • HFSS对变量赋值时,需要带上单位。因此我们需要对变量,例如W做如下操作:
W =str(k *2+4)+"um"
  • HFSS调用仿真结果时,需要输入仿真结果的名称。命名规则如下:
"D=\'10um\' L=\'100um\' Lg=\'20um\' W=\'6um\'"

因此我们对仿真结果命名时,需要做如下操作

solution_name ="D=\'10um\'L=\'"+ L +"\' Lg=\'"+ Lg +"\' W=\'"+ W +"\'"

6. 运行结果

睡个午觉起来,发现仿真和SP文件导出已经全部完成(^_^)


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空