input a; input b; input c; reg d; wire e; reg f; // 时序逻辑,有寄存器 always@(posedge clk)begin 'b1)begin d <= b; end else begin d <= c; end end // 组合逻辑 assign e = d & a; //时序逻辑 always@(posedge clk)begin if(b&&e)begin f <= 'b1; end else begin f <= 'b0; end end
有上面这一段verilog代码有的时候验证为了验证而验证就需要在验证环境或者用例中用systemverilog的while(1)实现上面的这个功能,systemverilog是顺序执行语言,要实现时序逻辑中的寄存器输出是在下一拍的功能,需要对时序逻辑做特殊处理。组合逻辑则不需特殊处理,它的输出就在当拍。
input a; input b; input c; bit d; bit d_reg; bit e; bit f; bit f_reg; whlie()begin @(posedge clk); //----组合逻辑合时序逻辑赋值----// 'b1)begin d_reg = b; end else begin d_reg = c; end e = d & a; if(b&&e)begin f_reg = 'b1; end else begin f_reg = 'b0; end //----寄存器数据生效--------// #0.1; d = d_reg; f = f_reg; end
简单的处理就是对寄存器变量分两个变量来表示,比如上面的d和f,分别用d/d_reg和f/f_reg来表示,其中d_reg和f_reg只是中间变量,不能作为其他语句的输入,只能能在末尾将值赋给d和f,这样来模拟寄存器数据需要一段延时才输出的效果。d和f才能作为其他语句的输入(用于判断或者赋值语句右边的值)
1、对寄存器变量增加xxx_reg的变量
2、寄存器当前输出值为xxx_reg
3、xxx_reg的值只能在xxx_reg赋值前赋给xxx,一般就放在while(1)块的最后。