如何将信息从序列/属性内部传递到外部世界

时间:2016-07-19 03:08:29

标签: system-verilog

我有一个property正在等待两个不同的sequence发生,如下所示(sequenceproperty已在此处简化):

sequence seq1;
  logic [3:0] a;
  @(posedge clk) (some_signal1 == 1, a = other_signal1); 
endsequence

sequence seq2;
  logic [3:0] b;
  @(posedge clk) (some_signal2 == 1, b = other_signal2); 
endsequence

property abc;
  seq1 ##[1:$] seq2;
endproperty

some_signal1some_signal2other_signal1other_signal2都是RTL信号。

我的问题: 通过或覆盖property abc后,我想知道序列中采样的相应other_signal1other_signal2。如何访问这些信号值?

我正在考虑按层次结构访问sequence局部变量,例如seq1.aseq2.b。但这些是不允许的,因为他们是当地人。

将这些变量声明为正式参数也无济于事,因为无法在LHS中分配形式参数。

我的意图是我将这些信号用于其他目的,即:

cover property (abc) begin
  // grab seq1.a and seq2.b, and do some other tasks
end

1 个答案:

答案 0 :(得分:0)

您可以在( , )内的逗号右侧执行以下三项操作之一:

  • 分配(到本地变量)
  • 递增或递减
  • 调用任务,任务方法,void函数,void函数方法或系统任务。

(参见IEEE1800-2012,16.11调用关于序列匹配的子程序)

任务调用是关键。您可以在序列中调用的任务中分配任务范围之外的变量:

  sequence seq1;
    @(posedge clk) (some_signal1 == 1, assign_a(other_signal1)); 
  endsequence

  sequence seq2;
    @(posedge clk) (some_signal2 == 1, assign_b(other_signal2)); 
  endsequence

  property abc;
    seq1 ##[1:$] seq2;
  endproperty

  cover property (abc) 
    $display("a= %d, b= %d", a , b);

  task assign_a(input int i);
    a = i;
  endtask

  task assign_b(input int i);
    b = i;
  endtask

http://www.edaplayground.com/x/akw