资讯动态

WGL波形生成语言—新手入门学习(三)

发布时间:2026/8/18 17:38:18 来源:尧图企业网站定制
WGL波形生成语言—新手入门学习一WGL波形生成语言—新手入门学习二WGL波形生成语言—新手快速入门—导航目录2.4.3.2扫描单元2.4.3.3 扫描状态2.4.3.4 扫描链2.4.3.5 时序模板2.4.3.2扫描单元扫描单元块用于表示器件的内部存储寄存器这些寄存器可通过串行移位扫描电路进行加载或观测。单个WGL输入文件中允许的扫描单元总数限制为32767个。 区分扫描单元与信号至关重要。WDB波形数据库存储信号的连续波形信息而扫描单元仅能表示特定时刻的逻辑状态瞬时。扫描单元无方向属性且与自动测试设备ATE或被测设备DUT的引脚无直接关联也不能在时间板TimePlates或模式参数列表中被引用。 WGL扫描单元块的语法如下scancell ScanCellDecl end扫描单元块的完整BNF语法表示如下ScanCells :: “scanCell” { ScanCellDecl } “end” ScanCellDecl :: cellName [ ScanGroup ] [ “:” Radix ] “;” ScanGroup :: “[” [ ScanRange | ScanGroupMembers ] “]” ScanRange :: bitNumber “..” bitNumber ScanGroupMembers :: CellReference { “,” CellReference } CellReference :: ( cellName [ Range ] ) Range :: “[” bitNumber [ “..” bitNumber ] “]” Radix :: “radix” ( “binary” | “octal” | “decimal” | “hex” | “hexadecimal” | “symbolic” )扫描组ScanGroup语句允许你指定扫描单元的逻辑分组。一个组中的扫描单元可来自多个扫描链。每个扫描组成员ScanGroupMember必须是先前已定义的除非该成员是另一个扫描组的名称。 扫描组和寄存器的可选基数Radix说明用于扫描状态向量中。支持的基数通过WGL保留字实现binary二进制、hex十六进制、octal八进制、decimal十进制和symbolic符号型。 扫描单元ScanCells块的示例如下scancell latchA; latchB; datareg[0..7]: radix hexadecimal; group_1[latchA, latchB, datareg[7]]: radix octal; end该扫描单元块示例定义了器件内的可扫描单元。单元可以是单比特锁存器如latchA也可以是多比特寄存器如datareg。此外还可指定扫描单元的逻辑分组如group_1。2.4.3.3扫描状态扫描状态块Scan State block中的每个状态声明定义了所有扫描单元集合在某个时刻的完整状态。输入扫描的目标是达成该状态输出扫描的目标是观测该状态。一个扫描状态向量可被零个或多个扫描模式行引用。加载或观测一个状态中的所有单元可能需要多个扫描链。 支持扫描向量的二进制格式。有关详细信息请参阅本章第2-102页的“二进制WGLBinary WGL”。此功能允许你将CAE计算机辅助工程仿真产生的二进制数据用作TDS测试数据系统的输入。WGL扫描状态块Scan State block的语法如下scanstate ScanStateDecl end扫描状态块Scan State block的完整BNF语法表示如下ScanState :: “scanState” { ScanStateDecl } “end” ScanStateDecl :: stateName “:” { StateVectorElement } “;” StateVectorElement :: chainName “(“ { stateString } “)”扫描状态声明ScanStateDecl指定扫描状态的名称以及该状态下所有扫描单元的值。stateName为标识符如果stateName用双引号 括起则可使用部分特殊字符。stateName拥有独立的命名空间但在所有其他状态中必须唯一。状态向量元素StateVectorElements的赋值方式为指定单元、寄存器、单元组或扫描链的名称并在括号中附加stateString值。stateString的解释基于关联单元引用的基数与模式状态的使用方式类似。WGL输出转换器WGL Out Converter始终生成状态向量且仅使用ALLSCAN作为唯一的单元引用。chainName为标识符在所有其他扫描链名称中必须唯一。扫描状态声明中未指定的任何单元的值均隐含为XTDS状态字符代表比较未知状态。测试设备用于驱动X的实际值依赖于具体技术并在TDS测试控制语言TCL中进行编程配置。若该部分状态被扫描输出相关比较操作将被屏蔽。状态字符串stateString的合法字符如下二进制基数支持0、1、Z、X十六进制基数支持0-9、A-F、Z、X八进制基数支持0-7、Z、X十进制基数支持0-9。以下是扫描状态块Scan State block的示例。ALLSCAN扫描组的比特顺序与WGL文件中扫描单元块Scan Cell block定义扫描单元及扫描寄存器的顺序一致。如果选择使用ALLSCAN组指定扫描状态向量则必须为扫描单元块中列出的每个扫描单元元素指定一个比特位。scanState state1 : latchA(1) latchB(0) datareg(3F); state2 : latchA(0) latchB(1) datareg(01); state3 : ALLSCAN(XX00000000); stateX : ; end本示例中的stateX状态声明设置了一个所有值均为X比较未知状态的状态。2.4.3.4扫描链扫描链块Scan Chain block定义了连接边界信号与扫描单元及反相器的电路路径配置。每条扫描链均通过标识符或带引号的字符串命名且该名称在信号、扫描单元、总线、扫描寄存器、组及其他扫描链中必须唯一。 WGL扫描链块的语法如下scanchain ChainDecl end扫描链块Scan Chain block的完整BNF语法表示如下ScanChain :: “scanChain” { ChainDecl } “end” ChainDecl :: chainName “[” ChainMembers “]” [ “:” Radix ] “;” ChainMembers :: ( InEdgeSignal | ChainMemList | OutEdgeSignal ) InEdgeSignal :: SignalReference ”,” OutEdgeSignal :: “,” SignalReference ChainMemList :: ChainMemReference { “ , ” ChainMemReference } SignalReference :: signalName ChainMemReference :: ( CellReference | “!” ) CellReference :: ( cellName [ Range ] ) Range :: “[” bitNumber [ “..” bitNumber ] “]” Radix :: “radix” ( “binary” | “octal” | “decimal” | “hex” | “hexadecimal” | “symbolic” )chainName为标识符在所有其他扫描链名称中必须唯一。 链成员列表ChainMembers list表示扫描链元素的有序序列其隐含的移位方向为从左到右。链成员列表表示的是扫描链元素的序列。隐含的移位顺序从左到右)输入边界信号InEdgeSignal或输出边界信号OutEdgeSignal均可省略但如果该扫描链被扫描模式行直接引用则至少需指定其中一个。输入边界信号的信号引用SignalReference必须已预先声明为1比特宽的输入信号或双向信号输出边界信号的信号引用必须已预先定义为1比特宽的输出信号或双向信号。保留符号“!”表示状态反相。扫描链可作为其他扫描链的成员前提是声明不存在递归。若未指定基数Radix则默认使用二进制基数。扫描链块Scan Chain block的示例如下scanchain chain1 [ SC1_IN, datareg[0], latchA, datareg[2], SC1_OUT] : radix octal; chain2 [ SC2_IN, datareg[1], !, datareg[7], datareg[5], latchB, datareg[4], !, datareg[6]]; end该扫描链块Scan Chain block示例展示了两条物理扫描链上扫描单元的排列顺序。chain1的单元列表中第一个和最后一个元素是边界信号SC1_IN和SC1_OUT的名称这两个信号必须已在某个信号块Signals block中预先定义。chain2包含输入信号SC2_IN但无对应的输出信号因此该链可用于控制所列扫描单元的状态但无法观测这些单元的状态。chain2的单元列表中出现了两次保留符号“!”这表示当状态在datareg[1]与datareg[7]之间、以及datareg[4]与datareg[6]之间移位时会发生反相。支持并行扫描链但各扫描链不能完全相同。以下是并行扫描链的合法使用示例。waveform t1 scancell latch1; latch2; latch3; latch4; latch5; latch6; latch7; latch8; end scanstate state1 : latch1(0) latch2(0) latch3(0) latch4(0); state2 : latch1(0) latch2(0) latch3(0) latch4(1); state3 : latch1(0) latch2(0) latch3(1) latch4(1); state4 : latch1(0) latch2(1) latch3(0) latch4(0); state5 : latch1(0) latch2(1) latch3(0) latch4(1); estate1 : latch5(1) latch6(1) latch7(1) latch8(0); estate2 : latch5(1) latch6(1) latch7(0) latch8(1); estate3 : latch5(1) latch6(1) latch7(0) latch8(0); estate4 : latch5(1) latch6(0) latch7(1) latch8(1); estate5 : latch5(1) latch6(0) latch7(1) latch8(0); estateX : ; end signal clock : input; scanIO : bidir; scanOut : output; enable : input; end scanChain chain1 [scanIO, latch1, latch2, latch3, latch4]; chain3 [latch1, latch2, latch3, latch4, scanIO]; chain2 [latch5, latch6, latch7, latch8, scanOut]; end timeplate scanTiming period 200ns clock : input [0ps:D, 50ns:S, 100ns:D]; enable : input [0ps:S]; scanIO : input [0ps:S]; scanIO : output [0ps:X, 50ns:Q]; scanOut : output [0ps:X, 50ns:Q, 90ns:X]; end pattern pat1 (clock, enable, scanIO:I, scanIO:O, scanOut) vector(, scanTiming) : [1 1 1 - X]; scan(,scanTiming) : [1 1 - - -], input[chain1:state1], output[chain3:estate1]; vector(, scanTiming) : [1 1 1 - X]; scan(,scanTiming) : [1 1 - - -], input[chain1:state2], output[chain2:estate2]; vector(, scanTiming) : [1 1 1 - X]; scan(,scanTiming) : [1 1 - - -], input[chain1:state3], output[chain2:estate3]; vector(, scanTiming) : [1 1 1 - X]; scan(,scanTiming) : [1 1 - - -], input[chain1:state4], output[chain2:estate4]; vector(, scanTiming) : [1 1 1 - X]; scan(,scanTiming) : [1 1 - - -], input[chain1:state5], output[chain2:estate5]; end end2.4.3.5时序模板时序模板块TimePlates block用于定义波形的时序组件。时序模板TimePlates承载了整体波形中存在的各类独特时序信息。WGL时序模板块TimePlate block的语法如下timeplate timeplateName TimePlate end时序模板块TimePlates block的完整BNF语法表示如下Timeplates :: “timeplate” timeplateName TimePlate “end” TimePlate :: “period” TimeReference [ “timeset” tsNumber ] Channels TimeReference :: (Time | variableName ) Time :: timeValue Unit Unit :: ( “ps” | “ns” | “us” | “ms” | “sec” ) Channels :: { SignalReference { “,” SignalReference } “:” Track } SignalReference :: signalName [ Range ] Range :: “[” bitNumber [ “..” bitNumber ] “]” Track :: [ Direction ] [ “[” FirstEvent { “,” Event } “]” ] “;” Direction :: ( “input” | “output” | “bidir” ) [ ( “reference” | “timing” ) ] FirstEvent :: “0” Unit “:” TDSstate[“’”( “edge” | “window” ) ] Event :: TimeReference “:” TDSstate [ “’”( “edge” | “window” ) ]timeplateName是一个标识符用于在WGL程序的后续部分中引用该时序模板TimePlate。每个时序模板通过保留字period分配一个总时序周期。时序模板声明定义了该时序模板的组成部分。variableName是一个变量名该变量已在方程式集块EquationSheet block的表达式集子块ExprSet sub-block中预先定义。每个时序模板都有一个总时间周期紧跟在保留字period之后适用于该周期的长度。该周期可以是大于零的数值也可以是已在方程式集块EquationSheet block的表达式集子块ExprSet sub-block中预先定义的变量。注意用于时序模板块TimePlates block中的变量其值以时间单位表示时必须具有实际意义。时序模板TimePlate包含一个信号通道列表。从概念上讲通道是一个或多个信号名的容器每个信号名后均紧跟一条轨迹。每个通道可包含一个或多个信号、总线、组或多路复用组件multiplexed parts。这些实体必须已在信号块Signals block中预先声明。每个通道将信号与一条轨迹相关联轨迹本身包含波形的方向、形状和时序的实际信息。用于表示波形的TDS状态必须与该方向输入或输出对应的可用状态一致。有关TDS状态字符列表请参阅第2-73页的表2-7。共享同一通道的所有信号必须具有兼容的方向。track包含了波形的方向形状和时序信息注意虽然允许使用多路复用组件multiplexed parts但不允许使用多路复用信号或总线即那些在信号块Signals block中标记有多路复用属性mux attribute、且其时序参数来自多路复用组件的信号或总线。实际上时序是为多路复用组件定义的这些组件随后会为其在信号块中关联的多路复用信号或总线提供数据。轨迹中的第一个事件必须具有字面时间值 0不允许使用变量提供的时序。后续事件可使用字面时间值或变量指定其时序若使用变量该变量必须已在方程式集块EquationSheet block的表达式集子块ExprSet sub-block中预先定义。有关详细信息请参阅第 2-56 页的表达式集ExprSet。 保留字 timeset 可用于定义一个与该时序模板TimePlate中时序相关联的测试器专用时序集名称。该时序集在 WaveBridge 运行生成的 WDB波形数据库文件中定义。 以下是一个简单的时序模板块TimePlates block示例timeplate read period 250ns timeset 1 clock: input [0ps:D, 50ns:U, 100ns:D, 150ns:U, 200ns:D, 250ns:U]; in : input [0ps:D,170ns:U]; out : output [0ps:X,180ns:Q’edge, 220ns:X]; end双向信号若使用保留字bidir指定方向可占用一个通道若同时使用保留字input和output定义方向则占用两个通道。前者为通道进行周期内输入/输出切换后者为通道进行周期间输入/输出切换。这两种方式可组合使用单个信号最多可占用三个通道。每条轨迹内包含一个以逗号分隔的事件列表。每个事件由时间time定义的时间值和一个TDS状态组成。对于输入通道必须使用TDS强制逻辑状态字符对于输出通道必须使用TDS期望逻辑状态字符对于双向通道可同时使用TDS强制状态字符和期望状态字符。 TDS状态字符“S”表示实际状态字符将在该位置“替换”到波形中实际状态字符来自模式块pattern block对应列的数据位。换句话说当轨迹包含“S”状态字符时实际状态由模式数据推导得出。 TDS状态字符“P”表示该状态取自之前的状态来自之前相邻的模板。TDS状态字符“C”表示该状态是替换状态的补码。每一个事件由时间和状态信息组成时间模块中定义了信号值的替换规则对于输出通道必须使用比较逻辑状态。TDS状态字符“Q”表示该状态取自模式块pattern block对应列的数据位。TDS状态字符“R”表示该状态是替换状态的补码。 输出状态后可跟可选保留字edge边沿或window窗口默认值用于指定边沿选通或窗口选通。在WaveBridge运行过程中其资源分配功能会尝试分配该保留字所指定的选通类型。上述示例中使用了保留字edge。edge和window指示比较方式以下是一个典型的时序模板块TimePlates block示例包含信号块Signals block中的对应信号定义以及模式块Patterns block中定义的模式数据。注意多路复用总线multiplexed buses的使用。timeplate writeTP period 80ns edge0: input[0ps:D, 2ns:U, 8ns:D, 10ns:?]; # Clock for data bit bus1[0] edge1: input[0ps:?, 10ns:D, 12ns:U, 18ns:D, 20ns:?]; # Clock for data bit bus1[1] edge2: input[0ps:?, 20ns:D, 22ns:U, 28ns:D, 30ns:?]; # Clock for data bit bus1[2] edge3: input[0ps:?, 30ns:D, 32ns:U, 38ns:D, 40ns:?]; # Clock for data bit bus1[3] edge4: input[0ps:?, 40ns:D, 42ns:U, 48ns:D, 50ns:?]; # Clock for data bit bus2[0] edge5: input[0ps:?, 50ns:D, 52ns:U, 58ns:D, 60ns:?]; # Clock for data bit bus2[1] edge6: input[0ps:?, 60ns:D, 62ns:U, 68ns:D, 70ns:?]; # Clock for data bit bus2[2] edge7: input[0ps:?, 70ns:D, 72ns:U, 78ns:D, 80ns:?]; # Clock for data bit bus2[3] rd/_wr: input[0ps:?, 20ns:D, 80ns:?]; # Indicate write cycle bus1[0]: input[0ps:D, 5ns:S, 10ns:?]; # Data bit 0 bus1[1]: input[0ps:?, 10ns:D, 15ns:S, 20ns:?];# Data bit 1 bus1[2]: input[0ps:?, 20ns:D, 25ns:S, 30ns:?];# Data bit 2 bus1[3]: input[0ps:?, 30ns:D, 35ns:S, 40ns:?];# Data bit 3 bus2[0]: input[0ps:?, 40ns:D, 45ns:S, 50ns:?]; # Data bit 4 bus2[1]: input[0ps:?, 50ns:D, 55ns:S, 60ns:?]; # Data bit 5 bus2[2]: input[0ps:?, 60ns:D, 65ns:S, 70ns:?]; # Data bit 6 bus2[3]: input[0ps:?, 70ns:D, 75ns:S, 80ns:?]; # Data bit 7 end pattern load1( FastClock, rd/_wr, Databus) vector(, writeTP) : (11111111 1 10101010XXXXXXXX); end从示例中可以看出多路复用组件multiplexed parts无需定义为时序轨迹timing track的连续片段为满足特定测试器的需求多路复用组件的已定义时序中允许存在间隙。多路复用组件在时序模板块TimePlate block中可按任意顺序出现时序轨迹中定义的时序亦是如此。例如edge7 和 edge2 的时序可以合法定义为edge2: input[0ps:?, 70ns:D, 72ns:U, 78ns:D, 80ns:?]; . . . edge7: input[0ps:?, 20ns:D, 22ns:U, 28ns:D, 30ns:?];如你所见这些时序值的顺序与示例中所示的顺序相反。模式数据11111111 1 10101010XXXXXXXX会映射到相应的总线和信号。边沿选通edge strobe是向测试器比较器硬件发出的指令要求其对被测器件DUT的输出进行瞬时采样并将采样结果与期望数据expect data进行比较。窗口选通window strobe则指示测试器比较器硬件验证期望数据在整个时间段窗口内是否持续出现在被测器件DUT上。若未指定任何一个保留字所使用的WaveBridge工具会默认该事件为窗口选通。定义轨迹时需确保为后续每个事件分配递增的时间值无论使用常量时间值还是变量波形的第一个事件必须始终从0皮秒0pS开始不允许将第二个事件定义在20纳秒20nS、第三个事件定义在15纳秒15nS。请注意所有事件时间均相对于周期起始时刻。时间必须递增第一个时间的时间必须从0ps开始所有事件的时间都是相对于周期的起始时间。用于扫描模式行的时序模板TimePlates必须满足特定要求终止于同一模式行所引用扫描链的信号必须具有采样状态即出现在扫描链起始端的信号在其各自的波形中必须包含S状态字符而出现在扫描链末端的信号必须包含Q状态字符。 任何其他状态字符均违反上述限制运行TDS WGL输入转换器TDS WGL In Converter时会生成TDS WDB检查工具TDS WDB Checker Utility错误信息或在将包含该时序模板的WDB文件作为输入提供给TDS扫描桥模块TDS ScanBridge module时生成TDS测试器规则检查器TDS Tester Rules Checker错误信息。其他信号的模式值Pattern values可选填非必填项。如果时间模块中使用扫描pattern在扫描链的开始必须是S状态最后必须是Q状态对照状态表就明白了。以下是一个可用于扫描模式行的时序模板块TimePlates block示例timeplate runSC period 500ns SC1_IN : input[0pS:S, 250nS:D]; SC2_IN : input[0pS:S, 250nS:D]; SC1_OUT : output[0pS:X, 250nS:Q]; SC_CLOCK : input[0pS:U, 250nS:D]; SC_EN : input[0pS:U]; BUS_D : output[0pS:X]; ADDR_IN : input[0pS:P]; end注意在上述示例中只有包含未解析状态如S或Q对应的TDS状态字符的信号才是扫描信号即终止扫描链的信号。该时序模板块示例展示了如何编码一种协议以并行测试chain1和chain2。扫描链已在第2-29页的扫描链块示例中预先定义。两个链共享公共扫描时钟SC_CLOCK和使能引脚SC_EN。输入信号SC1_IN和SC2_IN在周期的前半段被驱动输出信号SC1_OUT在周期的后半段被采样。其他与扫描链无关的输入信号如ADDR_IN保持“之前”的值即扫描操作开始前的取值。非扫描输出信号如BUS_D被屏蔽。有关详细信息请参阅后续的模式块Patterns部分。你可以在时序模板块TimePlates block中使用变量替代字面时间值。这些变量必须预先在方程式集块EquationSheet block的默认表达式集子块ExprSet sub-block中定义。有关详细信息请参阅第2-56页的表达式集ExprSet部分。 变量可用于替代时序模板周期值TimePlate period value和任意事件时间。你可以混合使用字面时间值和变量但时序轨迹time track中的第一个事件必须始于0皮秒0pS且必须以字面时间值表示。以下示例展示了如何在时序模板块TimePlate block中使用已在方程式集块EquationSheet block中定义的变量。变量的使用以粗体突出显示timeplate ts1 period write_cycle clk : input[0pS:D, 20nS:U, tclk1:D, 90nS:U]; ale : input[0pS:D, t1:S, t2:D]; RE : input[0pS:D, 20nS:S, 50nS:D]; OE : input[0pS:P, 30nS:S]; strobe : output[0pS:X, t3:Q, 90nS:X]; end下一篇预告WGL波形生成语言—新手入门学习四

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价