1 input a; 2 input b; 3 input c; 4 reg d; 5 wire e; 6 reg f; 7 8 // 时序逻辑,有寄存器 9 always@(posedge clk)begin 10 if(a==1‘b1)begin 11 d <= b; 12 end else begin 13 d <= c; 14 end 15 end 16 17 // 组合逻辑 18 assign e = d & a; 19 20 //时序逻辑 21 always@(posedge clk)begin 22 if(b&&e)begin 23 f <= 1‘b1; 24 end else begin 25 f <= 1‘b0; 26 end 27 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(1)begin @(posedge clk); d = d_reg; f = f_reg; if(a==1‘b1)begin d_reg = b; end else begin d_reg = c; end e = d & a; if(b&&e)begin f_reg = 1‘b1; end else begin f_reg = 1‘b0; end 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)中@(posedge clk)的下面。
原文地址:https://www.cnblogs.com/yuandonghua/p/10741910.html
时间: 2024-11-11 13:48:54