SV interface and Program3
时钟域的理解

- 在仿真过程中,时钟跳变的一瞬间,CPU将时间域划分为不同的时钟域执行不同的代码
- 信号在芯片中都是金属丝,在进行跳变的时候都是电容的充放电过程,通常使用时钟上升沿进行模拟,而不使用时钟下降沿
// define the interface
interface mem_if(input wire clk);
logic reset; // logic可以作为输入和输出
logic we_sys;
logic cmd_valid_sys;
logic ready_sys;
logic [7:0] data_sys;
logic [7:0] addr_sys;
logic we_mem;
logic ce_mem;
logic [7:0] datao_mem;
logic [7:0] datai_mem;
logic [7:0] addr_mem;
// modport for meomry controller interface
modport ctrl (
input clk,reset,we_sys,cmd_valid_sys,addr_sys,datao_mem,
output we_mem,ce_mem,addr_mem,datai_mem,ready_sys,
ref data_sys
);
//modport for memory model interface
modport meomry (
input clk,reset,we_mem,ce_mem,addr_mem,datai_mem,
output datao_mem
);
// modport for test program
modport test (
input clk,ready_sys,
output reset,we_sys,cmd_valid_sys,addr_sys,
ref data_sys
);
endinterface
// memory model design with interface
// 传入modport接口
module memory_model (mem_if.memory mif);
// memory array
logic [7:0] mem [0:255];
//write logic
always @(posedge mif.clk)
if(mif.ce_mem && mif.we_mem) begin
mem[mif.addr_mem] <= mif.datai_mem;
end
// read logic
always @(posedge mif.clk)
if(mif.ce_mem && ~mif.we_mem) begin
datao_mem <= mem[mif.addr_mem];
end
endmodule
// memory controller design with interface
module memory_ctrl(mem_if.ctrl cif);
typedef enum {IDLE,WRITE,READ,DONE} fsm_t;
fsm_t state;
always @(posedge cif.clk)
if(cif.reset) begin
state <= IDLE;
cif.we_mem <= 0;
cif.ce_mem <= 0;
cif.addr_mem <= 0;
cif.datai_mem <= 0;
cif.data_sys <=0;
end
else begin
case(state)
IDLE: begin
cif.ready_sys <= 1'b0;
if(cif.cmd_valid_sys && cif.we_sys) begin
cif.addr_mem <= cif.addr_sys;
cif.datai_mem <= cif_data_sys;
cif.we_mem <= 1'b1;
cif.ce_mem <= 1'b1;
state <= WRITE;
end
if(cif.cmd_valid_sys && ~cif.we_sys) begin
cif.addr_mem <= cif.addr_sys;
cif.datai_mem <= cif_data_sys;
cif.we_mem <= 1'b0;
cif.ce_mem <= 1'b1;
state <= READ;
end
end
WRITE: begin
cif.ready_sys <= 1'b1;
if(~cif.cmd_valid_sys) begin
cif.addr_mem <= 8'b0;
cif.datai_mem <= 8'b0;
cif.we_mem <= 1'b0;
cif.ce_mem <= 1'b0;
state <= IDLE;
end
end
READ: begin
cif.ready_sys <= 1'b1;
if(~cif.cmd_valid_sys) begin
cif.addr_mem <= 8'b0;
cif.datai_mem <= 8'b0;
cif.we_mem <= 1'b0;
cif.ce_mem <= 1'b0;
cif.ready_sys <= 1'b1;
state <= IDLE;
cif.data_sys <= 8'bz;
end
end
endcase
end
endmodule
program test(mem_if.test tif);
initial begin
tif.reset <= 1;
tif.we_sys <= 0;
tif.cmd_valid_sys <= 0;
tif.addr_sys <= 0;
tif.data_sys <= 8'bz;
#100 tif.reset <= 0;;
for(int i = 0;i<4;i++) begin
@(posedge tif.clk)
tif.we_sys <= 1;
tif.cmd_valid_sys <= 1;
tif.addr_sys <= 1;
tif.data_sys <= $random;
@(posedge tif.clk)
tif.we_sys <= 0;
tif.cmd_valid_sys <= 0;
tif.addr_sys <= 0;
tif.data_sys <= 8'bz;
end
repeat(10) (posedge tif.clk)
// 此模块没有写完....
end
endprogram
module top();
logic clk = 0;
always #10 clk++;
mem_if u_miff(clk);
memory_ctrl u_ctrl(u_miff);
meomry_model u_model(u_miff);
test u_test(u_miff);
endmodule
SV interface and Program3的更多相关文章
- SV中的Interface和Program
Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface arb_ ...
- SV学习之interface
普通的模块使用法:注意我们这里只实现了部分功能....不是完全的读写模块.... module mem_core( input logic wen, input logic ren, ...
- Cadence UVM基础视频介绍(UVM SV Basics)
Cadence关于UVM的简单介绍,包括UVM的各个方面.有中文和英文两种版本. UVM SV Basics 1 – Introduction UVM SV Basics 2 – DUT Exampl ...
- Libsvm:脚本(subset.py、grid.py、checkdata.py) | MATLAB/OCTAVE interface | Python interface
1.脚本 This directory includes some useful codes: 1. subset selection tools. (子集抽取工具) subset.py 2. par ...
- Shell_Oracle Erp和其他系统Interface资料传输通过Shell进行控制(案例)
2014-06-26 Created By BaoXinjian
- systemverilog interface
普通的模块使用法:注意我们这里只实现了部分功能....不是完全的读写模块.... module mem_core( input logic wen, input logic ren, ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- SV class
SV中的class通过new来创建实例,new函数可以传递多个参数: packet P1: P1 = new:创建一个P1的对象: P2 = P1:P2也指向同一个对象: P2 = new P1:P ...
- sv命令空间 packge
SV中的module,interface,program,checker,都提供declaration空间,内部定义都local当前的那个scope,相互之间的building block不影响,不识 ...
- SV通过DPI调用C
Verilog与C之间进行程序交互,PLI(Programming Language Interface)经过了TF,ACC,VPI等模式. 使用PLI可以生成延时计算器,来连接和同步多个仿真器,并可 ...
随机推荐
- Prometheus 与 VictoriaMetrics对比
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享 时序数据库有很多,比如Prometheus.M3DB.TimescaleDB.OpenTSDB.InfluxDB等等.Pro ...
- python异步编程之asyncio低阶API
低阶API介绍 asyncio中低阶API的种类很多,涉及到开发的5个方面.包括: 获取事件循环 事件循环方法集 传输 协议 事件循环策略 本篇中只讲解asyncio常见常用的函数,很多底层函数如网络 ...
- CentOS安装openGauss2.0.1
CentOS安装openGauss2.0.1 OpenGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行.openGauss内核源自PostgreSQL,深度融合华为在数据库领域多年 ...
- win10 安装 AutoCAD
有些人在 win10 系统下 安装 AutoCAD 会有些小问题,不要担心,根据下面这些图片就可以解决你的问题 答案很简单,就是安装.NET Framework3.5,这里提供一种安装方法供大家参考: ...
- 鸿蒙轻内核源码分析:Newlib C
摘要:本文介绍了LiteOS-M内核Newlib C的实现,特别是文件系统和内存分配释放部分,最后介绍了Newlib钩子函数. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二十 Newlib ...
- vue2升级vue3:TypeScript下vuex-module-decorators/vuex-class to vuex4.x
因为vue2 下 vue-property-decorator + vue-tsx-support +vuex-module-decorators/vuex-class ,class compone ...
- 如何对APP进行安全加固
如何对APP进行安全加固 引言 如今,移动应用市场蓬勃发展,APP数量呈现爆炸性增长.随着5G技术的广泛应用,APP的增长趋势持续增强.然而,由于APP的泛滥,网络攻击者的目标也在逐渐转移,数亿的 ...
- 信创就用国产的生态,Solon v2.6.4 发布
Solon 是什么框架? Java 新的"生态级"应用开发框架.从零开始构建,有自己的标准规范与开放生态(历时六年,具备全球第二级别的生态规模). 相对于 Spring,有什么特点 ...
- JS 实现 HashMap
HashMap代码(这种实现方式是错误的,错误原因:代码中_map._length变量是HashMap的所有实例共用的): /** * HashMap * 2021年09月09日 */ (functi ...
- 在Windows下配置Clang编译器
Preferences Linux & macOS 平台LLVM 相关工具链下载 2019年,在Windows下配置Clang编译器 Visual Studio 2022 中使用 Clang ...