组合逻辑与时序逻辑的行为级建模


行为建模是工业上采用的一种非常重要的描述方式,可以用来进行大型芯片的设计。行为建模可以描述一个设计的功能特性,即所设计的电路是干什么的,而不是怎样去实现他的硬件设计。行为级模型描述的是电路的输入—输出模型,忽略了电路的低层次内部结构和物理实现的细节。传播延时不包含在电路的行为级模型中,但在单元的传播延时会对逻辑的物理实现产生定时约束的情况下要由综合工具在目标工艺实现是对其进行考虑。

基于布尔方程的组合逻辑行为级模型

布尔方程可以用变量的运算表达式描述组合逻辑,在Verilog中其对应的形式为连续赋值语句。
在这里插入图片描述
如上图所示,一个5输入与或非门(AOI)电路可用一个单个的连续赋值语句来描述,该语句是通过输入运算来产生的电路输出,如下程序所示:

module AOI_5_CA0(y_out,x_in1,x_in2,x_in3,x_in4,x_in5

   );
   input x_in1,x_in2,x_in3,x_in4,x_in5;
   output y_out;
    
   assign y_out = ~(x_in1 & x_in2)|(x_in3 & x_in4 & x_in5);
    
endmodule

传播延时与连续赋值

传播延迟与连续赋值相关联,使得它的隐式逻辑与其门级对应电路具有同样的功能和定时特性。

例:在隐式逻辑上具有单位传播延时的与或非门结构的可用如下所示的程序段描述。每个wire变量定义都包含了一个给变量赋值的逻辑表达式,还包括了一个单位延时。在仿真过程中三个连续赋值语句同时执行,每个语句都有一个由仿真器实现的检测机构,来表示语句右边表达式的变化,并依据传播延时,用所发生的变量来更新左变量,就像等效组合逻辑在输入的影响下进行工作的情况一样。

module AOI_5_CA1(y_out,x_in1,x_in2,x_in3,x_in4,

   );
   input x_in1,x_in2,x_in3,x_in4;
   output y_out;
    
   wire #1 y1 = x_in1 & x_in2;
   wire #1 y2 = x_in3 & x_in4;
   wire #1 y_out = ~(y1 |y2);
    
endmodule

连续赋值语句忽略了有关模型内部结构的细节,只给出了描述比较器输入-输出关系的布尔方程。用综合工具可以创建赋值语句的实际硬件实现,其结果如下图所示:
在这里插入图片描述

锁存器与电平敏感电路

锁存器的电平敏感机制可以用多种方法进行模拟。首先注意如果右边表达式中的一个变量也是赋值的目标变量,那么这组连续赋值语句就具有隐式反馈。例如交叉耦合的与非门对就可建模为:

assign q = set $ qbar
assign qbar = rst & q;

其隐式的特性也是电平敏感的,但是它将与硬件锁存器的反馈结构相对应。然而,综合工具无法适应这种反馈形式,但是它们支持右边使用条件操作符的隐式反馈的连续赋值语句。

例:对锁存器模型使用一个嵌套的条件操作符来为透明锁存器增加低有效复位功能。其程序如下所述:

module latch_rbar_CA(q_out,data_in,enable,rst

    );
    input data_in,enable,rst;
    output q_out;
    
    assign q_out = !rst ? 0 : enable ? data_in : q_out;
endmodule

添加testbench文件(根据前面模型添加激励)后,仿真波形如下所示:
在这里插入图片描述
连续赋值语句对于模拟较小的布尔表达式、三态行为特性以及透明锁存器是很方便的。但是当有几个变量和较大表达式时,在一个连续赋值语句中书写很长的布尔方程模型容易出错。布尔表达式也可能使设计的功能表达得不清楚,即使书写完全正确也会。

触发器和锁存器的周期性行为模型

在模拟电平敏感行为(如组合逻辑和透明锁存器)时,连续赋值语句受到了限制。它们不能模拟具有边沿敏感行为的元件,例如触发器。许多数字系统都是借助同步信号(通常称为时钟)一个边沿的触发动作同步运行的。Verilog用周期性的行为来模拟电路的边沿敏感功能,就像单通行为可用来模拟测试平台中的信号发生器一样,这种周期性行为是抽象的,而且不能用硬件来指定其信号值。然而,它们可以通过执行过程语句来产生变量值,就像执行一般程序语言(如C)的语句一样,能够在存储器中获取、复制和存储变量。之所以称为周期行为,是因为它们在最后一条过程语句执行完之后仍然不能终止,而是继续执行。这些语句的执行可能是无条件的,或者可能是由一个可选事件控制表达式进行管理的。

周期行为可用于模拟(和综合)电平敏感和边沿敏感(同步)行为(如触发器)。

例:程序段df_behav中关键词always定义了一个边沿触发的触发器相对应的周期性行为。在clk的每个上升沿,执行描述这样行为的过程语句,计算q值并将它存到存储器中。在q变化后,连续赋值语句立即由q形成q_bar。

module df_behav(q,q_bar,data,set,rst,clk

    );
    input data,set,rst,clk;
    output q,q_bar;
    reg q;
    
    assign q_bar = ~q;
    
    always@(posedge clk)        //带同步置位和复位功能的触发器
      begin
      if(rst == 0)q<=0;
      else if(set==0)q<=0;
      else q <= data;           
      end
endmodule

逻辑电路如下所示:
在这里插入图片描述

周期性行为和边沿检测

周期性行为在仿真一开始便被激活,并且在延迟控制(#延时控制操作符)和事件控制表达式(@事件控制操作符)所决定的定时控制条件下执行与其相关的过程语句。Verilog关键词posedge验证事件控制表达式,并在自变量信号(如例4的clk)的上升沿到来时执行过程语句。上升沿(posedge)和下降沿(negedge)的边沿语义已内置于Verilog语言中。

仿真器自动监视事件控制表达式中的变量,当表达式的值改变时,如果使能状态也发生了变化,则执行相关的过程语句;当周期性行为的所有语句执行结束时,计算动作流程返回到关键词always,并再次按照事件控制表达式开始执行。如果一条正在执行的语句遇到延迟控制操作符或者事件控制表达式,那么行为的动作流程处于暂停等待状态,直到指定的时间结束或者事件控制表达式检测到合适的行为动作,才能继续执行。在df_behav中,周期性行为过程语句中的条件(if和elseif)测试相关表达式的计算值是否为真,如果为真,那么就会执行相应语句(或begin…end块语句)。

例:触发器的复位可能是异步的。下面由asynch_df_behav所模拟的功能对时钟上升沿敏感,而且也对set和rst的下降沿敏感。只有在异步输入不成立时,条件语句中的最后一个句子在clk上升沿时刻才会执行。

module df_behav(q,q_bar,data,set,rst,clk

    );
    input data,set,rst,clk;
    output q,q_bar;
    reg q;
    
    assign q_bar = ~q;
    
    always@(negedge set or negedge rst or posedge clk)
      begin
      if(rst == 0)q<=0;
      else if(set==0)q<=0;
      else q <= data;           //同步行为
      end
endmodule

逻辑电路如下图所示:
在这里插入图片描述
asynch_df_behav的周期性行为在仿真开始时便被激活并立刻停止,直到事件控制表达式发生变化时为止。形成的表达式可作为set、reset和clk的“事件或”。Verilog语言允许在事件控制表达式中有电平敏感和边沿敏感的变量混合应用的情况,但是综合工具不支持这样的行为模型。要注意检查描述是完全边沿敏感,还是完全电平敏感。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhyj_918

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值