一键创建网站,html5网站,会员管理软件,网站转化率相关阅读
Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 1、块语句 块语句(block statements)是一种把语句组织在一起#xff0c;这样他们在语法上就像单个语句一样工作。Verilog HDL中有两种类型的块#xff1a; …相关阅读
Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 1、块语句 块语句(block statements)是一种把语句组织在一起这样他们在语法上就像单个语句一样工作。Verilog HDL中有两种类型的块
顺序块也叫begin-end块并行块也叫fork-join块 顺序块应该由关键词begin和end分隔顺序块中的过程语句应该按照它们在块中给出的顺序依次执行。 并行块应该由关键词fork和join分隔并行块中的过程语句并发执行这里的并发执行不是指严格在同时有两个语句执行而是指在同一个仿真时间同时执行因为实际上仿真器永远是串行执行语句在这里指语句的执行顺序不确定。
1.1、顺序块
顺序块具有以下特性
语句应按顺序执行一条语句执行完后才会执行下一条语句。每条语句的延迟是相对于前一条语句完成的仿真时间而言的。控制流应该在最后一条语句完成后从块内传出。
下图给出了顺序块语法的BNF表示。 例1顺序块使以下的两个赋值有确定性结果。
beginareg breg;creg areg; //creg存储了breg的值
end 第一条语句对areg的赋值一定会在控制转移到执行第二条语句前完成因此creg获得的是areg也即是breg的值。 例2可以在顺序块中使用时序控制来在时间上分离两个赋值。
beginareg breg; (posedge clock) creg areg; //只有posedge上升沿事件发生第二条语句才会执行
end 例3以下示例显示了如何使用顺序块和时序控制的组合来指定时序波形
parameter d 50; // 一个参数声明
reg [7:0] r; // 声明一个8位reg变量
begin // 一个由时序控制的波形#d r h35;#d r hE2;#d r h00;#d r hF7;#d - end_wave; //触发一个叫end_wave的事件
end 1.2、并行块
并行块具有以下特性
语句并发执行。每个语句的延迟是相对于进入并行块的仿真时间而言的。时序控制可用于为赋值提供时间顺序。时序上最后一条语句执行完成后控制从块内传出。
下图给出了并行块语法的BNF表示。 例子以下示例通过使用并行块而不是顺序块对1.1例3中所示的波形进行重新描述。reg上产生的波形对于两种实现方式来说完全相同。
fork#50 r h35;#100 r hE2;#150 r h00;#200 r hF7;#250 - end_wave;
join 1.3、块名字 顺序块和并行块都可以通过在关键字begin或fork后面添加name_of_block来命名。块的命名有几个目的
它使得能为块声明局部变量(variables)、参数(parameter)和命名事件(named event)。它允许在诸如disable语句之类的语句中引用块。即允许层次引用 所有变量应为静态变量也就是说所有变量都存在一个唯一的位置离开或进入块不应对变量有任何影响。 命名块创建了一个新的结构层次从而允许在任何位置对命名块内的变量进行访问。 1.4、开始和结束时间 顺序块和并行块都有开始和结束时间的概念。对于顺序块开始时间是执行第一条语句时结束时间是执行完最后一条语句时。对于并行块所有语句的开始时间仿真时间都相同而结束时间是执行完最后一个被调度语句的时间。 顺序块和并行块可以相互嵌入从而使复杂的控制结构能够容易地表达并具有高度的结构。当块相互嵌入时块开始和结束的时间很重要。直到达到块的完成时间也就是说直到块完全完成执行才应继续执行块后面的语句。
例1以下示例是1.1例3的语句但这些语句以相反的顺序编写但仍产生相同的波形
fork#250 - end_wave;#200 r hF7;#150 r h00;#100 r hE2;#50 r h35;
join 例2当在发生两个单独的事件称为事件的连接之后进行赋值时fork-join块可能很有用。
beginforkAevent;Bevent;joinareg breg;
end 这两个事件可以按任何顺序发生甚至在同一仿真时间发生fork-join块将完成并退出对areg进行赋值。相反如果fork-join块是begin-end块并且Bevent发生在Aevent之前那么该块将等待下一个Bevent才会跳出begin-end块。 例3此示例显示了两个顺序块每个块将在其控制事件发生时执行。因为事件控制在fork-join块中所以它们是并行执行的因此这两个顺序块之间是可以并行执行的。
forkenable_a begin#ta wa 0;#ta wa 1;#ta wa 0;endenable_b begin#tb wb 1;#tb wb 0;#tb wb 1;end
join 以上内容来源于《IEEE Standard for Verilog® Hardware Description Language 2005》有删改