SV_15_Hierarchy

目录

1 packages

2. Top level module

3. Nested module

4. Extern module


摘要:Verilog中除全局的系统任务和函数外,所有的数据、函数和任务都在模块中。Verilog模块也可以包含其他模块的实例,并且任何未实例化的模块都位于顶层,另外模块的层次结构通常是任意的,在维护端口列表上无疑会花费大量的精力。

  SV对verilog的一个重要增强是可以通过模块端口(包括网络)来传递任何数据类型,以及所有的变量类型(包括实数、数组和结构)。 

1 packages

  • 在verilog中如果不使用“include compiler directive”,就没有办法跨模块共享公共代码(任务和 函数);
  • package 提供了在 多个模块之间 共享公共代码的方法;
  • 可以共享的内容:
  1. parameter
  2. data
  3. type
  4. task
  5. function
  6. sequence
  7. property
  • package所遵循的规则:
  1. package  不能包含任何赋值语句;
  2. package的变量声明赋值应该出现在任何initial、always、always_comb、always_latch或者always_ff块 之前;
  3. package 中的项不能有层次引用;
  • 访问 package 的数据、函数和类型的两种方法:
  1. 通过类范围解析算子     ::
  2. 通过import语句:该语句提供了package内标识符的直接可见性;
  • package是用来定义一个通用的实用程序的,通常具有持久性和不可重写性;

一个完整的例子:

 1 //+++++++++++++++++++++++++++++++++++++++++++++++++
 2 //   Package Declaration
 3 //+++++++++++++++++++++++++++++++++++++++++++++++++
 4 package msgPkg;
 5   integer  errCnt  = 0;
 6   integer  warnCnt = 0;
 7   bit      terminate_on_error = 0;
 8   string   msgName = "NULL";
 9   //=================================================
10   // Initilizes the messaging
11   //=================================================
12   task initMsgPkg (string mName, bit term);
13     terminate_on_error = term;
14     msgName = mName;
15   endtask
16   //=================================================
17   // Prints the INFO message
18   //=================================================
19   task  msg_info (string msg);
20     $display ("@%0dns %s INFO : %s",$time,msgName,msg);
21   endtask 
22   //=================================================
23   // Prints the warning message
24   //=================================================
25   task  msg_warn (string msg);
26     $display ("@%0dns %s WARN : %s",$time,msgName,msg);
27     warnCnt ++;
28   endtask 
29   //=================================================
30   // Prints error message
31   //=================================================
32   task  msg_error (string msg);
33     $display ("@%0dns %s ERROR : %s",$time,msgName,msg);
34     errCnt ++;
35     if (terminate_on_error) $finish;
36   endtask 
37   //=================================================
38   // Prints fatal message and terminates simulation
39   //=================================================
40   task  msg_fatal (string msg);
41     $display ("@%0dns %s FATAL : %s",$time,msgName,msg);
42     $finish;
43   endtask 
44   //=================================================
45   // Returns the error count
46   //=================================================
47   function integer getErrCnt();
48     getErrCnt = errCnt;
49   endfunction
50   //=================================================
51   // Returns the warning count
52   //=================================================
53   function integer getWarnCnt();
54     getWarnCnt = warnCnt;
55   endfunction
56 
57 endpackage
msgPkg Package Declaration
 1 //+++++++++++++++++++++++++++++++++++++++++++++++++
 2 //   Package Declaration
 3 //+++++++++++++++++++++++++++++++++++++++++++++++++
 4 package definesPkg;
 5   //=================================================
 6   // TypeDefs declaration
 7   //=================================================
 8   typedef enum  {FALSE, TRUE} bool;
 9   typedef struct {
10      bit   [7:0]   addr;
11      bit   [7:0]   data;
12      bit           wr;
13   } mem_s; 
14 
15 endpackage
definesPkg Package Declaration
 1 //=================================================
 2 // Include all the files
 3 //=================================================
 4 `include "msgPkg.sv"
 5 `include "definesPkg.sv"
 6 //=================================================
 7 // Import the Packages
 8 //=================================================
 9 import msgPkg::*;
10 import definesPkg::bool;
11 
12 //+++++++++++++++++++++++++++++++++++++++++++++++++
13 // DUT Using the package
14 //+++++++++++++++++++++++++++++++++++++++++++++++++
15 module simple_package();
16 
17 bool   value = definesPkg::FALSE;
18 
19 initial begin
20   msgPkg::initMsgPkg("PACKAGES",0);
21   msgPkg::msg_info("Testing Packages");
22   #10 msgPkg::msg_warn("Testing Packages");
23   #10 msgPkg::msg_error("Testing Packages");
24   msgPkg::msg_info($psprintf("Warning Count %0d, Error Count %0d",
25    msgPkg::getWarnCnt(), msgPkg::getErrCnt()));
26   if (value != definesPkg::TRUE)  
27     #10 msgPkg::msg_fatal("Value is FALSE");
28 end
29 
30 endmodule
Import the Packages
1     
2  @0ns PACKAGES INFO : Testing Packages
3  @10ns PACKAGES WARN : Testing Packages
4  @20ns PACKAGES ERROR : Testing Packages
5  @20ns PACKAGES INFO : Warning Count 1, Error Count 1
6  @30ns PACKAGES FATAL : Value is FALSE
Simulation : Package

2. Top level module

$root:作用时明确指向顶层实例,或者表明实例化的根(在打印时会有明确显示);

 1 //+++++++++++++++++++++++++++++++++++++++++++++++++
 2 // Child Module
 3 //+++++++++++++++++++++++++++++++++++++++++++++++++
 4 module child();
 5 
 6 //=================================================
 7 // Method inside child
 8 //=================================================
 9 task print();
10  $display("%m : Inside Module child");
11 endtask 
12 
13 initial begin
14   $root.top.U.U.print();
15 end
16 
17 endmodule
18 
19 
20 //+++++++++++++++++++++++++++++++++++++++++++++++++
21 // Parent Module
22 //+++++++++++++++++++++++++++++++++++++++++++++++++
23 module parent();
24 
25 //=================================================
26 // Method inside parent
27 //=================================================
28 task print();
29  $display("%m : Inside Module praent");
30 endtask 
31 
32 child U ();
33 
34 initial begin
35   $root.top.U2.print();
36   $root.top.U.print();
37 end
38 
39 endmodule
40 
41 //+++++++++++++++++++++++++++++++++++++++++++++++++
42 // Top Module
43 //+++++++++++++++++++++++++++++++++++++++++++++++++
44 module top();
45 
46 parent U();
47 child U2();
48 
49 //=================================================
50 // Method inside top
51 //=================================================
52 task print();
53  $display("%m : Inside Module top");
54 endtask 
55 
56 endmodule
57 
58 //compile result
59     
60  top.U.U.print : Inside Module child
61  top.U2.print : Inside Module child
62  top.U.print : Inside Module praent
63  top.U.U.print : Inside Module child
View Code

3. Nested module

  • 在verilog中,不允许模块内部嵌套声明另一个模块;
  • 在SV中,允许模块声明嵌套;
  • 外部名称空间对内部模块是可见的,因此任何声明的名称都可以使用,除非被local隐藏 ;
  • 嵌套模块的一个目的是在不使用端口的情况下显示模块的逻辑分区;
 1 //+++++++++++++++++++++++++++++++++++++++++++++++++
 2 // Nested Module
 3 //+++++++++++++++++++++++++++++++++++++++++++++++++
 4 module nested_module();
 5 
 6 //=================================================
 7 // Module declration inside the module 
 8 //=================================================
 9 module counter(input clk,enable,reset, 
10 output logic [3:0] data);
11 
12   always @ (posedge clk)
13     if (reset) data <= 0;
14     else if (enable) data ++;
15 endmodule
16 
17 logic clk = 0;
18 always #1 clk++;
19 logic enable, reset;
20 wire [3:0] data;
21 
22 counter U(clk,enable,reset,data);
23 
24 initial begin
25   $monitor("@%0dns reset %b enable %b data %b",
26      $time,reset,enable,data);
27   reset <= 1;
28   #10 reset <= 0;
29   #1 enable <= 1;
30   #10 enable <= 0;
31   #4 $finish;
32 end
33 
34 endmodule
35 
36 //compile result    
37  @0ns reset 1 enable x data xxxx
38  @1ns reset 1 enable x data 0000
39  @10ns reset 0 enable x data 0000
40  @11ns reset 0 enable 1 data 0000
41  @13ns reset 0 enable 1 data 0001
42  @15ns reset 0 enable 1 data 0010
43  @17ns reset 0 enable 1 data 0011
44  @19ns reset 0 enable 1 data 0100
45  @21ns reset 0 enable 0 data 0101
View Code

4. Extern module

  • 为了支持单独编译,可以使用模块的extern声明来声明模块上的端口,而不需要定义模块本身;
  • extern模块声明由关键字extern后跟模块名称和模块的端口列表组成;
 1 extern module counter (input clk,enable,reset, 
 2   output logic [3:0] data);
 3 
 4 //+++++++++++++++++++++++++++++++++++++++++++++++++
 5 // Extern Module
 6 //+++++++++++++++++++++++++++++++++++++++++++++++++
 7 module extern_module();
 8 
 9 logic clk = 0;
10 always #1 clk++;
11 logic enable, reset;
12 wire [3:0] data;
13 
14 counter U(clk,enable,reset,data);
15 
16 initial begin
17   $monitor("@%0dns reset %b enable %b data %b",
18      $time,reset,enable,data);
19   reset <= 1;
20   #10 reset <= 0;
21   #1 enable <= 1;
22   #10 enable <= 0;
23   #4 $finish;
24 end
25 
26 endmodule
Extern Module
 1 //=================================================
 2 // Module declration 
 3 //=================================================
 4 module counter(input clk,enable,reset, 
 5 output logic [3:0] data);
 6 
 7   always @ (posedge clk)
 8     if (reset) data <= 0;
 9     else if (enable) data ++;
10 
11 endmodule
12 
13 //compile result
14  @0ns reset 1 enable x data xxxx
15  @1ns reset 1 enable x data 0000
16  @10ns reset 0 enable x data 0000
17  @11ns reset 0 enable 1 data 0000
18  @13ns reset 0 enable 1 data 0001
19  @15ns reset 0 enable 1 data 0010
20  @17ns reset 0 enable 1 data 0011
21  @19ns reset 0 enable 1 data 0100
22  @21ns reset 0 enable 0 data 0101
counter module
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值