SystemVerilog基础:八种命名空间(定义命名空间、包命名空间、编译单元域命名空间、文本宏命名空间、模块命名空间,块命名空间、端口命名空间、属性命名空间)详解(下)
相关阅读SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html?spm1001.2014.3001.5482目录五、模块命名空间六、块命名空间七、端口命名空间八、属性命名空间SystemVerilog有八个标识符命名空间其中两个是全局的定义命名空间和包命名空间两个是对于编译单元(compilation unit)全局的编译单元域命名空间和文本宏命名空间四个是局部的模块命名空间块命名空间、端口命名空间和属性命名空间。五、模块命名空间模块命名空间由下面结构引入模块(module)、接口(interface)、包(package)、程序(program)、检查器(checker)和原语(primitive)。它统一了这些结构中的模块、接口、程序、检查器、函数(function)、任务(task)、命名块(named block)、实例名(instance name)、参数(parameter)、命名事件(named event)、线网声明(net declaration)、变量声明(variable declaration)和用户定义类型(variable declaration)的标识符注意这六种结构并不一定能包括所有这些元素比如包中不能定义模块。例13给出了一些模块命名空间的标识符重名的例子以一个模块为例。// 例13 // 文件module.sv module SharedNameModule #(parameter int sharedName 10); // 参数名为sharedNam // 用户定义类型名为sharedName typedef struct { // 结构内容 } sharedName; // 用户定义类型名为 sharedName // 接口定义名为sharedName interface sharedName; // 接口内容 endinterface // 模块实例名为sharedName SharedNameModule1 sharedName(); // 程序定义名为sharedName program sharedName; // 程序内容 endprogram // 检查器定义名为sharedName checker sharedName; // 检查器内容 endchecker // 函数定义名为sharedName function int sharedName(); // 函数内容 endfunction // 任务定义名为sharedName task sharedName(int a); // 任务内容 endtask // 命名块名为sharedName begin : sharedName // 命名块内容 end // 命名事件名为sharedName event sharedName; // 变量声明名为sharedName int sharedName 0; // 线网声明名为sharedName wire [7:0] sharedName; endmodule六、块命名空间块命名空间由下面结构引入命名块、匿名块、specify块、函数和任务。它统一了这些结构中的命名块、参数、命名事件、变量声明和用户定义类型的标识符注意这五种结构并不一定能包括所有这些元素比如specify块中不能定义命名事件。例14给出了一些模块命名空间的标识符重名的例子以一个命名块为例。// 例14 // 文件block.sv module ExampleModule; initial begin: top // 用户定义类型名为test typedef struct { int a1; } test; // 参数名为test parameter test 1; // 命名事件名为test event test; // 变量名为test reg test; // 在命名块中定义另一个命名块test根据Verilog语法规则块语句必须在其他声明后 begin: test $display(This is a test); end end endmodule七、端口命名空间端口命名空间由下面结构引入模块、接口、原语和程序。它提供了一种从结构上定义位于两个不同命名空间中的两个对象之间的连接的方法连接可以是单向的输入或输出也可以是双向的输入或输出。端口命名空间中的端口名称不能重复如例15所示。在端口命名空间中引入的端口名称可以通过声明与端口名称同名的变量类型或线网类型在模块命名空间中重新声明如例16所示。// 例15 // 文件port.sv module FaultyModule( input wire clk, // 时钟信号 input wire reset, // 复位信号 output wire clk, // 错误尝试再次使用clk作为输出 input wire dataIn // 数据输入 ); // 模块内容 endmodule// 例16 // 文件port.sv module FaultyModule( clk, // 时钟信号 reset, // 复位信号 data_in // 数据输入 data_out // 数据输出 ); input wire clk; // 重复声明 input wire reset; // 重复声明 input wire data_in; // 重复声明 output wire data_out; // 重复声明 endmodule八、属性命名空间属性命名空间是由附加到语言元素的(*和*)结构包围这些结构用于指定SystemVerilog源代码中的对象、语句和语句组的属性这些属性可由各种工具包括仿真器使用以控制工具的操作或行为如例17所示。属性名称只能在属性名称空间中定义和使用也不能在此名称空间中定义任何其他类型的名称。// 例17 // 文件attributes module MyModule #( parameter DATA_WIDTH 8 ) ( input wire clk, input wire reset, input wire [DATA_WIDTH-1:0] data_in, output wire [DATA_WIDTH-1:0] data_out ); // 使用属性指定寄存器优化 (* max_fanout 10 *) reg [DATA_WIDTH-1:0] buffer; always (posedge clk) begin if (reset) begin buffer 0; end else begin buffer data_in; end end assign data_out buffer; endmodule至此介绍完了SystemVerilog中的八个标识符命名空间定义命名空间、包命名空间、编译单元域命名空间、文本宏命名空间、模块命名空间块命名空间、端口命名空间、属性命名空间。其中大部分命名空间只讨论了标识符重名相关的性质并未讨论访问性问题即在哪里能访问到这些标识符因为这属于标识符引用问题包括标识符层次引用另一篇文章进行解释。