巴科斯-诺尔范式(bnf)是一种元语言,用于描述和定义编程语言的语法规则。以下是对bnf及其在systemverilog中的应用的详细说明:
巴科斯-诺尔范式(BNF)概述
BNF是一种元语言,用于描述语言的语法结构。它由一系列规则或“产生式”组成,每个产生式定义了语言中的一个结构。
- 产生式(Production):由一个或多个项目组成,项目可以是终端或非终端。
- 终端(Terminal):语法中不可再分解的基本元素。
- 非终端(Nonterminal):语法中需要进一步分解的元素。
-
产生式列表(Production List):多个项目按顺序排列,使用
|符号表示选择。
BNF在SystemVerilog中的应用
在SystemVerilog中,BNF用于定义randsequence语法,这是一种用于生成随机序列的语法结构。
- randsequence语法:由一个或多个产生式组成,每个产生式包含一个名称和一个产生式项目列表。
- 产生式项目:分为终端和非终端。非终端由终端和其他非终端定义,最终分解为终端。
- 终端:不可分割的项目,定义在其相关代码块中。
-
产生式列表:一系列按顺序排列的项目,使用
|符号表示选择,生成器会随机选择其中一个。
示例
例如,一个名为main的产生式可以定义为:
main ::= first second done first ::= add | dec second ::= pop | push
- 当选择
main时,生成的序列为first、second和done。 -
first产生式在add和dec之间随机选择。 -
second产生式在pop和push之间随机选择。 - 其他产生式如
add、dec、pop、push和done都是终端,由其代码块定义。
执行和结果
当执行randsequence语句时,生成器根据语法规则生成随机序列。每个产生式的执行会产生相应的代码块副作用,从而生成所需的刺激。
额外功能
SystemVerilog中的序列生成器还支持随机权重、交错和其他控制机制。递归产生式可以导致循环。
参考资料
- IEEE Std 1800-2017 SystemVerilog标准,第545-546页
- 克里斯,SystemVerilog验证测试平台编写指南,第169页
其他相关概念
- 函数(function):在SystemVerilog中,函数不消耗仿真时间,不能有时间延迟、阻塞语句、事件或调用task。
- 任务(task):可以消耗仿真时间。
- unique和priority关键字:用于if、case、casez、casex语句前,确保条件唯一性或优先级。
-
rand和randc:用于随机数生成,其中
randc确保每个值只生成一次。
代码示例
以下是使用randc的代码示例:
module test;
parameter N = 10;
rand bit[N-1:0] randc_var;
bit[N-1:0] gen_done[$];
function automatic bit[N-1:0] get_randc();
bit succ = 0;
while(!succ) begin
succ = std::randomize(randc_var) with { unique {randc_var,gen_done};};
end
gen_done.push_back(randc_var);
if(gen_done.size() == 2**N) begin
gen_done.delete();
end
return randc_var;
endfunction
initial begin
for (int i=0; i<100; i++) begin
$display("Randc value: %0d", get_randc());
end
end
endmodule

通过上述详细说明,读者可以更好地理解BNF在SystemVerilog中的应用及其相关概念。










