SystemVerilog将一系列任务转换为单独的文件,而不会丢失可读性

时间:2015-02-06 23:25:05

标签: verilog system-verilog

我为我的一些代码创建了一个测试平台,并随着时间的推移慢慢添加。 它对于一个文件来说真的太大了,所以我想将任务移到单独的文件中。

如何更改此内容:

tb.v

module tb
  int data;

  initial begin
    do_this;
    #10;
    do_that;
    #10;
    do_this;
    #10;    
  end

  task do_this ();
    begin
      data = 10;
    end
  endtask

  task do_that ();
    begin
      if (data==10) begin
         data = 20;
      end
      else begin
         data = 0;
      end
    end
  endtask

endmodule

这样的事情:

tb.v

module tb
  int data;

  initial begin
    do_this(data);
    #10;    data = 30; //<-- data is driven by the initial statement     and the modules
    #10;    do_that(data); //<-- data is both an input and an output
    #10;    
  end
endmodule

do_this.v

  module do_this (inout reg data); //<-- this is clearly wrong, but     gets the point across
    begin
         #5; //<-- can't use delay statement in a module like this.
         data = 10;
    end
  endmodule

do_that.v

  module do_that (inout reg data); //<-- this is clearly wrong, but     gets the point across
    begin
      if (data==10) begin
         data = 20;
      end
      else begin
         data = 0;
      end
    end
  endmodule

我尝试过使用`include,但是很容易忘记'数据'的修改方式和位置。 我目前正在尝试使用输入和输出的任务,但是做这样的事情似乎非常错误: do_that(.data_in(data), .data_out(data));

有更好/正确的方法来做这样的事吗? (classes / packages / global variables?)

1 个答案:

答案 0 :(得分:2)

您可以使用`include或using systemVerilog的包来实现这一点。您可以在包中定义任务或功能,并在多个模块之间共享它们。以下是包的示例:

package p;
    function int do_this();
      return 10; 
    endfunction

    function int do_that(input int in);
      if (in==10) return 20;
      else return 0;
    endfunction
endpackage

module top;
    import p::*;
    int data;
      initial begin
        data = do_this(); 
        #10;
        data = do_that(.in(data));
        #10;
        data = do_this(); 
        #10;
      end
endmodule

您可以定义多个包并将每个包定义放在单独的文件中。

在函数调用中使用参数名称实际上被认为是一种很好的编码实践。

此外,在任务/函数中使用全局变量通常不是一个好主意,并且会阻止数据封装。最好通过本地参数将所有内容传递给函数,以确保不会发生无意的更改。