sv时序组合和时序逻辑

 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)的下面。

猜你喜欢

转载自www.cnblogs.com/yuandonghua/p/10741910.html