cpu设计和实现(iverilog工具)

news2025/7/17 9:45:09

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        编写verilog的工具不少。大家熟知的modelsim、quartus和vivado都可以用来编写的。前者主要是用来仿真,quartus主要用于altera芯片(现在属于intel),vivado则服务于xilinx芯片(现在属于amd)。如果不愿意破解,其实找到一款合适的工具还是蛮难的,而且简单、方便、好上手。好在开源工具有iverilog这样一款工具,windows、linux、mac都可以安装。暂时不想购买开发板的朋友,可以试试,至少入门是不成问题的。

1、安装地址

http://bleyer.org/icarus/iverilog-v11-20190809-x64_setup.exe

        工具中本身包含了iverilog和gtkwave,前者负责编译,后者负责显示。

2、编译命令

C:\iverilog\bin\iverilog.exe -o tb tb.v cnt.v
C:\iverilog\bin\vvp.exe -n tb -lxt2
C:\iverilog\gtkwave\bin\gtkwave.exe hello.vcd

        命令主要是分成了三个部分。第一个命令iverilog主要是把所有的verilog文件编译在一起。第二个命令主要是仿真执行。第三个命令主要是把生成的hello.vcd文件显示出来。

3、cnt.v

        这是一个计数的代码,主要是周期性输出一个trigger信号。

module count(rst, clk, out);

// input & output
input rst;
input clk;
output out;

// wire & reg
wire rst;
wire clk;

reg ce;
reg out;

// inner wire & reg
reg[5:0] cnt;

// clause defined

always @(posedge clk or posedge rst)
	if(rst)
		ce <= 1'b0;
	else
		ce <= 1'b1;

always @(posedge clk or posedge rst)
    if (rst) begin
        cnt <= 6'h00;
    end else if (ce == 1'b1)begin 
		if (cnt == 6'd59)
			cnt <= 6'h00;
		else
			cnt <= cnt + 1;
	end

always @(posedge clk or posedge rst)
	if(rst)
		out <= 1'b0;
	else if(out == 1'b1)
		out <= 1'b0;
	else if(cnt == 6'd59)
		out <= 1'b1;

endmodule

           整个代码是关于定时输出trigger信号的代码。首先,有一个ce信号,它在rst后的第一个时钟上升沿才变得有效。接着有了ce信号之后,cnt信号就可以开始自增了。自增的范围是0~59。等到cnt等于59的时候,就恢复为0。out就是触发信号,除了一开始复位为0的时候,其他时刻只有cnt==59的时候才会翻转为1,并且只翻转一次,马上又恢复为0。

4、tb.v测试代码

`timescale 1ns/1ps
module test();

reg rst;
reg clk;
wire data;

count tt(.rst(rst),
    .clk(clk),
    .out(data));

initial
    begin
        rst = 0;
        clk = 0;
        #12 rst = 1;
        #21 rst = 0;
        #1000 $finish;
    end


initial
begin
    while(1)
    clk = #5 !clk;
end

initial
begin
    $dumpfile("hello.vcd");
    $dumpvars(0, test);
end

endmodule

        tb.v其实就相当于单元测试。给被测试函数输入指定的信号,观察信号是否按照我们之前设定的设计运行。如果是,则皆大欢喜。否则,就要回过头来看一下,确认错误发生的位置,并及时修正。注意中间的hello.vcd文件,这就是生成的中间结果,最终的波形都要通过它显示出来。

        另外,注意tb.v里面的信号类型和 cnt.v里面一般是反着来的。

5、波形显示

        hello.vcd文件直接用gtkwave显示就好,中间的波形可以自己选择,

        这个工具虽然粗糙了一些,但是基本的功能都是在的。 左上是模块,左下是模块对应的信号。中间是需要查看的信号。右侧是观察到的数据,大家如果使用过逻辑分析仪,应该观察过对应的场景。信号的放大、缩小、拖拽、信号的显示格式,这些功能都是在的。用它来仿真,其实问题不大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伪元素和伪类的概念和区别

目录 伪类 伪元素 区别&#xff1a; 对于区别的解释&#xff1a; 伪类 这是菜鸟教程下方的一个笔记&#xff0c;看着多但是干货满满。 伪类选择元素基于的是当前元素处于的状态&#xff0c;或者说元素当前所具有的特性&#xff0c;而不是元素的id、class、属性等静态的标志。…

小程序获取不到用户头像和昵称返回微信用户问题解决,即小程序授权获取用户头像规则调整的最新解决方案

最近好多同学在学习石头哥小程序课程的时候&#xff0c;遇到了下面这样的问题&#xff0c;在小程序授权获取用户头像和昵称时&#xff0c;获取到的是下面这样的。 到底是什么原因导致的呢&#xff0c;去小程序官方文档一看&#xff0c;又是官方改规则了。 点进去一看&#x…

超详细!linux系统nlg-eval安装指南

前言&#xff1a;最近在做文本生成的任务&#xff0c;需要用到bleu等评价指标&#xff0c;看到其他研究工作中都在用nlg-eval这个github库&#xff0c;就想把它拿过来用&#xff0c;然而安装过程并不是一帆风顺的&#xff0c;谨以此篇博客记录之&#xff0c;为后来者提供一些经…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-重要参数penalty C

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 正则化是用来防止模型过拟合的过程&#xff0c;常用的有L1正则化和L2正则化两种选项。这个增加的范式&#xff0c;被称为“正则项”&#xff0c;也…

11个开源测试自动化框架,如何选?

以下为作者观点&#xff1a; 如果你正在考虑建立你自己的测试自动化框架&#xff0c;请再想一想。在大多数情况下&#xff0c;你最好可以考虑一个或多个可用的开源选项。 这是因为&#xff0c;一般来说&#xff0c;框架是一套可以跨团队使用的最佳实践、假设、通用工具和库。…

操作符详解(C语言)

算术操作符(运算符)&#xff1a; - * / % 在算术运算符中&#xff0c; - * 跟我们数学中的运算是一样的 在这里主要说一下 / 跟 % 这两个操作符 1、/ &#xff08;除法&#xff09; 在除法运算中&#xff0c;若除号两边的操作数都为整型&#xff0c;则结果…

布隆过滤器(Bloom Filter)

[TOC](布隆过滤器(Bloom Filter)) &#xff08;1&#xff09;什么是布隆过滤器 &#xff08;1&#xff09;布隆过滤器的简单介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以…

Python中的print()

本专栏为学习B站杨淑娟老师视频所记&#xff0c;仅做个人笔记使用&#x1f60b;&#x1f60b;&#x1f60b; &#x1f449;杨淑娟老师视频课&#x1f448; Python 职位方向 一、chapter1 1.使用print函数进行简单的输出 a100 # 变量a,值为100 b50 # 变量b,值为50print(90) …

【Linux实验】软中断通信

实验目的&#xff1a; 1&#xff0e;了解什么是信号&#xff0c;熟练掌握signal&#xff08;&#xff09;&#xff0c;wait&#xff08;&#xff09;&#xff0c;exit&#xff08;&#xff09;&#xff0c;kill&#xff08;&#xff09;函数。 2&#xff0e;熟悉并掌握Linux系统…

Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation

学习目标&#xff1a; Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation&#xff08;零参考深度曲线估计&#xff09; 个人体会&#xff1a; 本文的特色就是使用了PA和CA,对不同通道和不同像素做不同处理,虽然本文的实现过程懂了,但是实现去雾…

缝纫机牙架的数控工艺工装设计与编程

目 录 绪 论 1 2.差动牙架的工艺设计 3 2.1 机械加工工艺规程概述 3 2.2.1 零件的技术条件 4 2.2.2 加工表面及其要求 5 2.2.3零件的材料 6 2.3毛坯的选择 6 2.3.1毛坯的种类 6 2.4 基准的选择 8 2.5 机械加工工艺路线的拟订 10 3 差动牙架的工装设计 17 3.1 夹具概述 17 3.2 …

牛客CM11 - 链表分割【环形链表雏形】

看来真的不能乱割呀~一、题目描述二、思路分析三、代码详解【保姆级教学】四、环形链表的疑难解惑五、整体代码展示六、总结与提炼一、题目描述 描述 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&am…

数据库-范式

目录 完全函数依赖部分函数依赖传递函数依赖码主属性非主属性第一范式(1NF)第二范式(2NF)第三范式(3NF)例题完全函数依赖 每一个属性都有用,缺一个都不能决定。 部分函数依赖 部分属性用不到,也可以决定 传递函数依赖

抽象类和(上)

大家好&#xff0c;又见面了&#xff0c;今天和大家浅谈一下抽象类 抽象类存在的意义就是被继承 抽象类 &#x1f437;1.抽象类的定义 &#x1f431;‍&#x1f680;2.抽象类的语法 &#x1f49a;3.抽象类的概念 &#x1f680;4.抽象类的作用 1.抽象类的概念 什么是 好…

[附源码]java毕业设计基于个性化的汽车购买推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何在Ubuntu 22.04上安装Linux 内核 6.0?

内核是任何基于 Linux 的操作系统的核心部分&#xff0c;它充当计算机系统软件和硬件之间的桥梁&#xff0c;还提供用户和应用程序与计算机交互所需的接口。内核提供了许多功能&#xff0c;包括进程调度、资源分配、设备管理、中断处理、内存管理和进程。 在撰写本文时&#x…

轻松学会jQuery选择器的用法

文章目录⛳️ 选择器✨ 属性选择器✨ 包含选择器✨ 位置选择器✨ 过滤选择器✨ 反向选择器⛳️ 快速投票⛳️ 选择器 本篇重点讲解jQuery中丰富的选择器&#xff0c;以及他们的基本用法。CSS的选择器均可以用jQuery的$进行选择&#xff0c;部分浏览器对CSS3的选择器支持不全&am…

大道至简,凯里亚德酒店成为酒店投资圈万众瞩目的“新”星

作为近年酒店市场的热门领域&#xff0c;中端酒店行业的发展一直颇受关注。随之而来的就是中端酒店品牌的不断增加&#xff0c;以及中端商旅、度假型酒店规模的不断扩大&#xff0c;经行业资深人士分析&#xff0c;未来中端酒店将成为酒店市场的主力产品。鉴于市场的发展趋势&a…

Netty中的缓存Bytebuf

首先我们来明确一下Buffer&#xff08;缓存&#xff09; JavaNIO中的Buffer、Netty中的Buffer、Netty中的Bytebuf这是3个不同的类&#xff0c;但实现的内容和完成的功能几乎一致&#xff0c;最原始的是JavaNIO中的Buffer实现&#xff0c;最先进的是Netty中Bytebuf的实现&#x…

10 分钟, 带你彻底掌握 SQL 多表查询

1.前言 多表查询&#xff0c;也称为多表连接查询&#xff1b;作为关系型数据库最主要的查询方式&#xff0c;在日常工作中被广泛使用 常见的多表查询操作包含&#xff1a;子查询、内连接、左外连接、右外连接、完全连接、交叉连接 本篇文章将利用一个实例逐一介绍这些操作 …