条件语句
调试探针条件
调试探针条件可在双向或三向分支条件语句中使用。每个调试探针条件都占用调试探针连接到的 ILA 的 PROBE 端口上
的 1 个触发器比较器。
重要提示 ! 每个 PROBE 端口都可包含 1 到 16 个触发器比较器 ( 在编译时配置 ) 。这意味着根据 PROBE 端口
上配置的比较器数量 , 在整个触发器状态机程序中 , 您只能使用调试探针条件中的特定调试探针 , 且次数仅限 1
到 16 次。
调试探针条件由 1 个比较运算符和 1 个值组成。有效的调试探针条件比较运算符包括 :
• == ( 等于 )
• != ( 不等于 )
• > ( 大于 )
• < ( 小于 )
• >= ( 大于或等于 )
• <= ( 小于或等于 )
有效值格式如下 :
<bit_width>'<radix><value>
其中 :
• <bit width> 表示探针的宽度 ( 以位数为单位 )
• <radix> 为以下值之一
○
b ( 二进制 )
○
h ( 十六进制 )
○
u ( 无符号十进制 )
• <value> 为以下值之一
○
0 ( 逻辑 0 )
○
1 ( 逻辑 1 )
○
X ( 忽略 )
○
R ( 0 到 1 转换 ) - 仅对 1 位探针有效
○
F ( 1 到 0 转换 ) - 仅对 1 位探针有效
○
B ( 双向转换 ) - 仅对 1 位探针有效
○
N ( 无转换 ) - 仅对 1 位探针有效
有效的调试探针条件值示例如下 :
• 1 位二进制值 0
1'b0
• 12 位十六进制值 7A
12'h07A
• 9 位整数值 123
9'u123
调试探针条件语句示例如下 :
• 单一位调试探针 abc 等于 0
if (abc == 1'b0) then
• 23 位调试探针 xyz 等于 456
if (xyz >= 23'u456) then
• 23 位调试探针 klm 不等于十六进制值 A5
if (klm != 23'h0000A5) then
多重调试探针条件语句示例如下 :
• 2 个调试探针比较 , 使用“ OR ”函数组合 :
if ((xyz >= 23'u456) || (abc == 1'b0)) then
• 2 个调试探针比较 , 使用“ AND ”函数组合 :
if ((xyz >= 23'u456) && (abc == 1'b0)) then
• 3 个调试探针比较 , 使用“ OR ”函数组合 :
if ((xyz >= 23'u456) || (abc == 1'b0) || (klm != 23'h0000A5)) then
• 3 个调试探针比较 , 使用“ AND ”函数组合 :
if ((xyz >= 23'u456) && (abc == 1'b0) && (klm != 23'h0000A5)) then
计数器条件
计数器条件可在双向或三向分支条件语句中使用。每个计数器条件都占用 1 个计数器比较器。
重要提示 ! 每个计数器仅含 1 个计数器比较器。这意味着 , 在整个触发器状态机程序中 , 每个特定计数器在任
一计数器条件中只能使用一次。
探针端口条件由 1 个比较运算符和 1 个值组成。有效的探针条件比较运算符包括 :
• == ( 等于 )
• != ( 不等于 )
重要提示 ! 每个计数器位宽始终为 16 位。
有效的计数器条件值示例如下 :
• 16 位二进制值 0
16'b0000_0000_0000_0000
16'b0000000000000000
• 16 位十六进制值 7A
16'h007A
• 16 位整数值 123
16'u123
计数器条件语句示例 :
• 计数器 $counter0 等于二进制 0
($counter0 == 16'b0000000000000000)
• 计数器 $counter2 不等于十进制 23
($counter2 != 16'u23)
调试探针条件与计数器条件的组合
调试探针条件与计数器条件可使用如下规则组合在一起以形成单一条件 :
• 所有调试探针比较都必须使用相同的“ || ” (OR) 或“ && ” (AND) 运算符组合在一起。
• 组合后的调试探针可使用“ || ” (OR) 或“ && ” (AND) 运算符与计数器条件加以组合 , 与用于组合调试探针比较操
作的运算符无关。
包含多个调试探针和计数器条件的语句示例如下 :
• 2 个探针比较运算使用“ OR ”函数组合 , 然后使用“ AND ”函数与计数器条件组合 :
if (((xyz >= 23'u456) || (abc == 1'b0)) && ($counter0 == 16'u0023)) then
• 2 个探针比较运算使用“ AND ”函数组合 , 然后使用“ OR ”函数与计数器条件组合 :
if (((xyz >= 23'u456) && (abc == 1'b0)) || ($counter0 == 16'u0023)) then
• 3 个探针比较运算使用“ OR ”函数组合 , 然后使用“ AND ”函数与计数器条件组合 :
if (((xyz >= 23'u456) || (abc == 1'b0) || (klm != 23'h0000A5)) &&
($counter0 ==
16'u0023)) then
• 3 个探针比较运算使用“ AND ”函数组合 , 然后使用“ OR ”函数与计数器条件组合 :
if (((xyz >= 23'u456) && (abc == 1'b0) && (klm != 23'h0000A5)) ||
($counter0 ==
16'u0023)) then
触发器状态机语言语法
注释 :
• 该语言区分大小写
• 注释字符为井号“ # ”字符。包含 # 字符以及该字符后的所有内容都将被忽略。
• ' THING ' = THING 表示终端
• {<thing>} = 0 或更多 thing
• [<thing>] = 0 或 1 个 thing
<program> ::= <state_list>
<state_list> ::= <state_list> <state> | <state>
<state> ::= 'STATE' <state_label> ':' <if_condition> | <action_block>
<action_block> ::= <action_list> 'GOTO' <state_label> ';'
| <action_list> 'TRIGGER' ';'
| 'GOTO' <state_label> ';'
| 'TRIGGER' ';'
<action_list> ::= <action_statement> | <action_list> <action_statement>
<action_statement> ::= 'SET_FLAG' <flag_name> ';'
| 'CLEAR_FLAG' <flag_name> ';'
| 'INCREMENT_COUNTER' <counter_name> ';'
| 'RESET_COUNTER' <counter_name> ';'
<if_condition> ::= 'IF' '(' <condition> ')' 'THEN' <actionblock>
['ELSEIF' '(' <condition> ')' 'THEN' <actionblock>]
'ELSE' <actionblock>
'ENDIF'
<condition> ::= <probe_match_list>
| <counter_match>
| <probe_counter_match>
<probe_counter_match> ::= '(' <probe_counter_match> ')'
| <probe_match_list> <boolean_logic_op> <counter_match>
| <counter_match> <boolean_logic_op> <probe_match_list>
<probe_match_list> ::= '(' <probe_match> ')'
| <probe_match>
<probe_match> ::= <probe_match_list> <boolean_logic_op> <probe_match_list>
| <probe_name> <compare_op> <constant>
| <constant> <compare_op> <probe_name>
<counter_match> ::= '(' <counter_match> ')'
| <counter_name> <compare_op> <constant>
| <constant> <compare_op> <counter_name>
<constant> ::= <integer_constant>
| <hex_constant>
| <binary_constant>
<compare_op> ::= '==' | '!=' | '>' | '>=' | '<' | '<='
<boolean_logic_op> ::= '&&' | '||'
--- The following are in regular expression format to simplify expressions:
--- [A-Z0-9] means match any single character in AB...Z,0..9
--- [AB]+ means match [AB] one or more times like A, AB, ABAB, AAA, etc
--- [AB]* means match [AB] zero or more times
<probe_name> ::= [A-Z_\[\]<>/][A-Z_0-9\[\]<>/]+
<state_label> ::= [A-Z_][A-Z_0-9]+
<flag_name> ::= \$FLAG[0-3]
<counter_name> ::= \$COUNTER[0-3]
<hex_constant> ::= <integer>*'h<hex_digit>+
<binary_constant> ::= <integer>*'b<binary_digit>+
<integer_constant> ::= <integer>*'u<integer_digit>+
<integer> ::= <digit>+
<hex_digit> ::= [0-9ABCDEFBN_]
<binary_digit> ::= [01XRFBN_]
<digit> ::= [0-9]