当前位置: 首页 > backend >正文

FPGA设计思想与验证方法系列学习笔记001

业精于勤荒于嬉,行成于思毁于随。

学无止尽~

小白常犯错误整理

Question1: input/output端口定义

对于设计模块而言:

input 的数据类型必须是wire,

output的数据可以是wire也可以是reg。

对于TESTBENCH仿真而言

module tb_my_module;// 声明与 DUT 接口对应的信号reg        clk;reg        rst_n;reg  [7:0] data_in;wire [7:0] data_out;wire       valid;// 实例化 DUTmy_module uut (.clk     (clk),.rst_n   (rst_n),.data_in (data_in),.data_out(data_out),.valid   (valid));// 激励生成部分initial beginclk = 0;rst_n = 0;#10 rst_n = 1;data_in = 8'h55;#20 data_in = 8'haa;#100 $finish;end// 时钟生成always #5 clk = ~clk;// 监控输出initial begin$monitor("Time=%0t: data_out=%h, valid=%b", $time, data_out, valid);endendmodule
输入端口(input) → 在 TestBench 中声明为 reg

因为这些信号是由 TestBench 驱动的,需要赋值或产生激励波形,所以必须是 reg 类型。

当然,如果你觉得麻烦就用system verilog的数据类型logic

 输出端口(output)→ 在 TestBench 中声明为 wire

因为这些信号是由 DUT 驱动的,TestBench 只能观测,不能赋值,因此使用 wire 类型。

Question2: 按位与和缩位

按位与

reg[1:0] a=2'b11

reg[1:0] b= 2'b10;

reg[1:0] c;

reg d;

c= a&b;  按位与操作,最终结果c=2'b10;

缩位

d = | c; // c =2'b10,最终d的结果是1.

(补充说明一下)

比如说:按位同或(~^或^~)

2个多位操作数按位进行同或运算,各位的结果按顺序组成一个新的多位数。例如,a=2’b10,b=2’b11,则a^~b的结果为2’b10;(相同为1,不同为0)

缩减操作都是对于一个对象而言,这里说的对象,不是男女关系的那种意思,我是说对于一个操作数而言。或者说对一个多比特信号进行操作的,包括以下几种:

缩减与(&):

对一个多位操作数进行缩减与操作,先将它的最高位与次高位进行与操作,其结果再与第二次高位进行与操作,直到最低位。例如,&(4’b1011)的结果为0;

Question3:parameter和localparam

parameter:

本module内有效的定义,可用于参数传递;

localparam:

只能在模块内部声明;

(不推荐使用defparam,仿真会失败!)

Question4:阻塞与非阻塞

阻塞:‘=’

等等我,你先计算,然后把结果给我,我等你。风险:竞争冒险。

适用于组合逻辑。

非阻塞:‘<=’

拍一张快照,拿到寄存器的当前值,开干。

适用于时序逻辑。

Question5:语法乱来

assign语句不能用在initial中。

Question6:边沿检测

首先我们要确认一件事情。

检测上升沿(~D[1])&&(D[0])

这是一个上升沿没有问题,对吧。

 检查下降沿(D[1])&&(~D[0])

这是一个下降沿,对吧。

reg [1:0] D;
D<= {D[0],data};

对于这个寄存器而言,D[1]就是前一时刻,跑的快,D[0]就是后一时刻,所以在图上看就在后面。

Question7:assign和always的用法

assign 用于描述组合逻辑,表示信号之间的连续关系。

特点​:

  • 只能用于 wire 类型信号
  • 右侧表达式变化时立即更新左侧
  • 不能包含时序控制(如延迟)
  • 适合简单的组合逻辑

always 块可以描述组合逻辑或时序逻辑,取决于敏感列表。

(1) 组合逻辑 always 块

组合逻辑 always 块

特点​:

  • 敏感列表使用 @(*) 或列出所有输入信号
  • 块内赋值使用阻塞赋值 =
  • 必须对所有可能的输入组合给出输出(避免锁存器)

(2) 时序逻辑 always 块

特点​:
• 敏感列表包含时钟边沿(posedge/negedge)
• 块内赋值使用非阻塞赋值 <=
• 可以描述寄存器、状态机等时序逻辑

补充说明:verilog规定assign中的赋值目标必须是wire型的,而always语句中的赋值目标
必须是reg型的。

(持续更新)

http://www.xdnf.cn/news/15093.html

相关文章:

  • 数组的应用示例
  • 【前端】jQuery数组合并去重方法总结
  • [论文阅读]Text Compression for Efficient Language Generation
  • 无缝矩阵与普通矩阵的对比分析
  • 「按键精灵安卓/ios辅助工具」动态验证码该怎么得到完整的图片
  • 电脑被突然重启后,再每次打开excel文件,都会记录之前的位置窗口大小,第一次无法全屏显示。
  • Prompt提示词的主要类型和核心原则
  • QTextCodec的功能及其在Qt5及Qt6中的演变
  • OKHttp 核心知识点详解
  • [Xmos] Xmos架构
  • Docker-构建镜像并实现LNMP架构
  • 【运维实战】解决 K8s 节点无法拉取 pause:3.6 镜像导致 API Server 启动失败的问题
  • 在指定conda 环境里安装 jupyter 和 python kernel的方法
  • vscode和插件用法
  • 「莫尔物理新范式」普林斯顿马普所合作Nature论文:SnSe₂/ZrS₂扭曲双层实现M点能谷调控与拓扑新效应
  • 如何设计一个登录管理系统:单点登录系统架构设计
  • 寒武纪MLU370编程陷阱:float32精度丢失的硬件级解决方案——混合精度训练中的定点数补偿算法设计
  • 字节 Seed 团队联合清华大学智能产业研究院开源 MemAgent: 基于多轮对话强化学习记忆代理的长文本大语言模型重构
  • 微服务架构的演进:迈向云原生——Java技术栈的实践之路
  • 西电考研录取:哪些省份考研上岸西电更容易?
  • 浏览器 实时监听音量 实时语音识别 vue js
  • 人大金仓教程
  • 【基础架构】——软件系统复杂度的来源(低成本、安全、规模)
  • 【基于大模型 + FAISS 的本地知识库与智能 PPT 生成系统:从架构到实现】
  • chatgpt是怎么诞生的,详解GPT1到GPT4的演化之路及相关背景知识
  • WebGPU了解
  • 二、深度学习——损失函数
  • AI技术如何重塑你的工作与行业?——实战案例解析与效率提升路径
  • 华为OD机试_2025 B卷_观看文艺汇演问题(Python,100分)(附详细解题思路)
  • Java零基础笔记09(Java编程核心:面向对象编程高级练习:支付模块)