SystemVerilog - Interface

接口(Interface)是SystemVerilog新增的重要部分,专门用于封装模块间的交互。接口同样有助于design复用。接口是层次化结构,可以包含其他接口。
下面是使用接口的一些优势:

  • 接口封装连接性,接口可以像单个部件一样使用,这样可以用一个替换传统的一组型号名。这简化的端口连接的代码,有利于维护,增加可读性。
  • 接口封装功能性,通过接口接连的模块,可以更容易划分。这样,抽象等级和交互协议的颗粒度可以独立于模块之外进行优化。
  • 接口可以包含参数,常数,变量,函数和任务,以及进程和连续赋值。这不仅有助于系统级的建模,也利于TB的应用。
  • 接口有助于建立功能覆盖率的记录和报告,协议检查和断言等应用。
  • 接口可用于Port-less的访问,一个接口在模块内可以直接例化成静态数据对象。这样,用于访问接口相关内部状态信息的方法就可以在不同时间点被调用,用来共享信息。
  • 灵活性,接口可以像模块一样参数化。同样,一个模块头可以建立的时候带着不指定的接口例化,称为原接口。这种接口可以在后面模块例化的时指定。
    简单来说,接口就是一捆线网的命名,类似结构体,除了接口可以作为模块的端口而结构体不行。
    下面例子展示了接口的定义和使用:
// Interface definition
interface Bus;
	logic [7:0] Addr, Data;
	logic RWn;
endinterface

// Using the interface
module TestRAM;
	Bus TheBus(); // Instance the interface
	logic [7:0] mem [0:7];
	RAM TheRAM (.MemBus(TheBus)); // Connect it
	initial 
	begin
		TheBus.RWn = 0;
		TheBus.Addr = 0;
		for (int I=0; I<7; I++)
			TheBus.Addr = TheBus.Addr + 1;
		TheBus.RWn = 1;
		TheBus.Data = mem[0];
	end
endmodule

module RAM(Bus MemBus);
	logic [7:0] mem[0:255];
	always @*
		if (MemBus.RWn)
			MemBus.Data = mem[MemBus.Addr];
		else
			mem[MemBus.Addr] = MemBus.Data;
endmodule

接口端口(Interface Ports)
接口同样可以有输入口,输出口和双向口。只有声明在端口列表的变量和线网,可以当端口例化时,根据名字或者位置于外部连接。接口可以与接口共享。端口使用ANSI的风格声明。
下面这个例子展示了带有时钟端口的接口:

interface ClockedBus (input Clk);
	logic [7:0] Addr, Data;
	logic RWn;
endinterface

Module RAM (ClockedBus Bus);
	always @(posedge Bus.Clk)
		if (Bus.RWn)
			Bus.Data = mem[Bus.Addr];
		else
			mem[Bus.Addr] = Bus.Data;
endmodule

// Using the interface
module Top;
	reg Clock;
	// Instance the interface with an input, using named connection
	ClockedBus TheBus (.Clk(Clock));
	RAM TheRAM (.Bus(TheBus));
	...
endmodule

参数化接口(Parameterised Interface)
下面是一个展示参数化接口的简单例子:

interface Channel #(parameter N=0)
		(input bit Clock, bit ACK, bit Sig);
	bit Buff[N-1:0];
	initial 
		for (int i=0; i<N; i++)
			Buff[i] = 0;
	always @ (posedge Clock)
		if (Ack == 1)
			Sig = Buff[N-1];
		else
			Sig = 0;
endmodule

// Using the interface
module Top;
	bit Clock, Ack, Sig;
	// Instance the interface. The parameter N is set to 7 using named
	// connection while the ports are connected using implict connection 
	Channel #(.N(7)) TheCh (.*);
	TX TheTx (.Ch(TheCh));
	...
endmodule

调整接口端口(Modports in Interface)

一个与接口相关的部件也加进来:调整端口。这给模块的接口提供了方向的信息并且在控制了任务和函数在特定模块的使用。
下面这个例子包含了调整端口,用来确定接口中信号的方向。方向是从模块的角度来看,在我们的例子中就是TheRAM

interface MSBus (input Clk);
  logic [7:0] Addr, Data;
  logic RWn;
  modport Slave (input Addr, inout Data);
endinterface

module TestRAM;
  logic Clk;
  MSBus TheBus(.Clk(Clk));
  RAM TheRAM (.MemBus(TheBus.Slave));
  ...
endmodule

module RAM (MSBus.Slave MemBus);
  // MemBus.Addr is an input of RAM
endmodule

接口中的任务(Tasks in Interfaces)

任务和函数可以在接口中定义,实现更抽象的建模。下面这个例子展示了两个用来建模总线功能的任务。任务在testRAM模块中调用。

interface MSBus (input Clk);
  logic [7:0] Addr, Data;
  logic RWn;

  task MasterWrite (input logic [7:0] waddr,
                    input logic [7:0] wdata);
    Addr = waddr;
    Data = wdata;
    RWn = 0;
    #10ns RWn = 1;
    Data = 'z;
  endtask

  task MasterRead (input  logic [7:0] raddr,
                   output logic [7:0] rdata);
    Addr = raddr;
    RWn = 1;
    #10ns rdata = Data;
  endtask
endinterface

module TestRAM;
  logic Clk;
  logic [7:0] data;
  MSBus TheBus(.Clk(Clk));
  RAM TheRAM (.MemBus(TheBus));
  initial
  begin
    // Write to the RAM
    for (int i = 0; i<256; i++)
      TheBus.MasterWrite(i[7:0],i[7:0]);

    // Read from the RAM
    for (int i = 0; i<256; i++)
    begin
      TheBus.MasterRead(i[7:0],data);
      ReadCheck : assert (data === i[7:0])
        else $error("memory read error");
    end
  end
endmodule
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值