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可以生成延时计算器,来连接和同步多个仿真器,并可 ...
随机推荐
- Java使用HttpUtil.request方法可以发送请求即【Java访问url得到响应数据】
Java使用HttpUtil.request方法可以发送请求即[Java访问url得到响应数据] 注:这个工具类可以在网上找,也可以自己手写 ,手写的话需要用到以下依赖: <dependency ...
- vulnhub - lazySysAdmin - writeup
信息收集 可以看到目标开放了常见的22, 80, 139, 445, 3306这个6667的服务少见. root@kali tmp/lazySysAdmin » arp-scan -I eth1 -l ...
- MySQL运维实战(1.3)安装部署:源码编译安装
作者:俊达 引言 在大多数情况下,我们不需要自己编译MySQL源码,因为编译的MySQL和二进制包的内容基本一致.然而,有些特殊情况可能需要我们采用源码编译的方式安装MySQL: 安装非标准版本的My ...
- elastic优化
通过定义keyword 的 "null_value" :"NULL",使得搜索是不用单独使用exists查询.统一用terms查询就能查询到想要的结果 利用co ...
- 机器学习周刊03:如何学习深度学习?2024 年学习生成式 AI 路线图、如何构建高效的RAG系统、苹果 腾讯最新论文、阿里DreaMoving
腾讯推出的 AppAgent,是一个多模态智能体,通过识别当前手机的界面和用户指令直接操作手机界面,能像真实用户一样操作手机! 机器学习周刊:关注Python.机器学习.深度学习.大模型等硬核技术 1 ...
- java判断两个日期是否连续
使用java判断两个日期的天是否连续 import java.text.SimpleDateFormat; import java.util.Date; /** * @author lingkang ...
- Java中单体应用锁的局限性&分布式锁
互联网系统架构的演进 在互联网系统发展之初,系统比较简单,消耗资源小,用户访问量也比较少,我们只部署一个Tomcat应用就可以满足需求.系统架构图如下: 一个Tomcat可以看作是一个JVM进程,当大 ...
- Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中
前言 今天要讲的是在Window 2008 R2版本的服务器下如何配置Web Deploy,和Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中. 因为历 ...
- MySQL进阶篇:详解索引结构
2.2 MySQL进阶篇:第二章_二.二_索引结构 2.2.1 概述 MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种: 索引结构 描述 B+Tree索引 最常见 ...
- 15年了,我们到底怎样才能用好 Serverless?
摘要:Serverless能够给企业客户和开发者带来非常直观的收益,包括成本节约和效率提升. 作者:冯嘉 一.Serverless发展历程及现状 1.1.Serverless概念 通常意义上来讲,Se ...