Verilog学习之路
Verilog编程规范
- 1.冒号前后==同时==出现变量
- 2.模块接口写法
- 2.1 parameter 、 localparam、`define
1.冒号前后同时出现变量
在已知所需位宽的情况下,可使用":-“或”:+"代替;比如我们有一个变量i,我们需要取出从i×8+7到i×8这8位数据,直接写[i×8+7:i×8]是会报错的。正确的写法是:
[8×i+7 -: 8]
2.模块接口写法
// msg_generator.v
`timescale 1ns/1ns
`include "head.v"
module msg_generator #(parameter VLAN_FLAG = 1'b1, // 指定是否Vlanparameter PORT_TYPE = `PORT_GMII, // 指定接口类型(对应不同输出位宽 PORT_TYPE 和 msg_vaild 的不同含义)parameter MSG_LEN = 11'd100, // 指定报文体总长度(E1588无效)(64:1:1518, 1600:64~1518随机)parameter MSG_NUM = 32'd1, // 指定连续发送报文总数(0:32'hFFFF_FFFF包)parameter PREOK_RATE = 7'd100, // 指定前导码完整概率(少字节数随机)(100:必完整, 0:必缺)parameter CRCOK_RATE = 7'd100, // 指定CRC正确概率(fake_crc=actual_crc+1)(100:必正确, 0:必错)parameter ALIGN_RATE = 7'd100 // 指定按DW对齐的概率(MSG_LEN 未对齐时上浮对齐)(100:必对齐, 0:忽略)
)
(input clock,input reset,input [`LIST_MAX*`CODE_WIDE-1:0] msg_list, // 指定类型列表(参见head.v)(首包写在高位)input [9:0] interval, // 指定报文发送间隔(单位:byte)(流量测试)output reg [PORT_TYPE-1:0] msg_out,output msg_vaild, // TX_EN, SMII: SYNCoutput msg_over, // 单包结束标志output all_finish, // 指定包数发完标志output [31:0] info_msgcnt, // 当前已发包数output [7:0] info_type, // 当前包报文类型output [3:0] info_prelen, // 当前包前导码字节数output [15:0] info_msglen // 当前包的实际长度(bytes)
);
例化调用:
// tb.v
localparam PORT_TYPE = `PORT_GMII;
wire [PORT_TYPE-1:0] msg_q;always @(posedge msg_over or posedge reset) beginrand_int <= 7+{$random}%6; //报文间隔 7-12
endreg [200:0] msg_list={`MSG_PDELAY_RESP,`MSG_RESP_FOLLOW_UP};
// 例化格式:
// input、output、parameter都没有要求必须写全
msg_generator #(.VLAN_FLAG (1),.PORT_TYPE (PORT_TYPE),.MSG_LEN (64),.MSG_NUM (20))gen_case(.clock (clk125m),.reset (reset),.msg_list (msg_list),.interval (12),.msg_out (msg_q),.msg_vaild (msg_vaild),.msg_over (msg_over),.all_finish (),.info_msgcnt (),.info_type (),.info_prelen (),.info_msglen ());
2.1 parameter 、 localparam、`define
parameter
区别于localparam
:parameter
写在模块接口中,在例化时更改,而localparam
则用于内部常量的定义;parameter
应提供默认值,在例化时即使没有“实参”与之对应,模块也能正常输出;parameter
在例化之初就被赋值,而input
、output
变量则是在例化初始化之后(如模块内的initial
块结束)才有值;- 因为
parameter
在例化时可以更改,而在reg
、input
、output
、inout
、wire
定义的时候须通过常量指定位宽,因此可用parameter
定义的常量来更改位宽以适应不同的例化需求; - define即宏定义,可定义各类常量(如数值、字符串等),一般单独写在一个
head.v
文件中:
// GOOSE SV
`define GO_APPID 16'h00
`define SV_APPID 16'h40
// TYPE STRING
`define S_NONE_NAMED ("Undefine Name String ")
`define S_GOOSE ("GOOSE ")
`define S_SV ("SV ")
在需要使用到该文件中定义的值时使用 :
`include "head.v"
其中元素的调用:
localparam TICK_SET = (PORT_TYPE==`PORT_SMII)?10:(8/PORT_TYPE);// 报文实际类型
always @(reset or msg_cnt) begin// 求余取type, 并调整次序msg_type = msg_list[(list_deep-msg_cnt%list_deep)*`CODE_WIDE-1-:`CODE_WIDE];
end
Verilog学习之路相关推荐
- Verilog学习之路(4)— Verilog HDL的程序设计语句
Verilog HDL的程序设计语句 一.连续赋值语句 连续赋值语句通常用来描述组合逻辑电路,连续赋值的目标类型主要是标量线网和向量线网两种,标量线网如"wire a,b;",向量 ...
- Verilog学习之路(8)— 时序电路的设计
Verilog学习之路(8)- 时序电路的设计 一.前言 时序逻辑电路的输出不仅与当前时刻输入变量的取值有关,而且与电路的原状态,即与过去的输入情况有关. 时序逻辑电路的两个特点: 时序逻辑电路包括组 ...
- Verilog学习之路(6)— 组合电路的设计
组合电路的设计 一.前言 组合电路的特点是电路中任意时刻的稳态输出仅仅取决于该时刻的输入,而与电路之前的状态无关,组合电路没有记忆功能. 在使用Verilog设计中组合电路的描述方法主要有四种:真值表 ...
- FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析
FPGA学习之路--原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异.原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作.而原码 ...
- FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU
FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...
- FPGA学习之路—接口(3)—SPI详解及Verilog源码分析
FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...
- FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析
FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...
- FPGA学习之路—接口(1)—URAT Verilog程序设计
FPGA学习之路--URAT Verilog程序设计 UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)是广泛使用的异步串行数据通信协议 ...
- 【Verilog HDL学习之路】第二章 Verilog HDL的设计方法学——层次建模
2 Verilog HDL的设计方法学--层次建模 重要的思想: 在语文教学中,应该先掌握核心方法论,再用正确的方法论去做题目,这样能够逐渐加深对于方法论的理解,做题的速度和准确率也会越来越高. 在V ...
最新文章
- 五、jvm垃圾回收3(几种垃圾收集器)
- 单调队列 Monotonic Queue / 单调栈 Monotonic Stack
- 释放锁的逻辑-LockInternals.releaseLock
- armadillo 配置
- linux下的多线程,linux下的多线程
- A+B and A*B problem 大数相加 相乘 模拟
- Java GUI实现图书管理系统
- 计算机软件税负率,2015最新增值税税负对照表
- 生化危机4重生 java_生化危机-绝密报告4
- EndNoteX9保姆级基础功能使用教程(够用!!)
- html5单位转换器,液体单位在线换算工具
- 抖音帐号如何避免播放量限流、降权和封号
- java jtextarea 超出_java – 如何保持JTextArea的大小不变?
- 创维E900V21E/E900V22E_S905L3B/S905L2B通刷_支持5621DS无线_完美语音线刷固件
- ipython shell_IPython 1.0发布,强大的Python交互式Shell
- matlab雨流计数,雨流计数法matlab程度源代码
- 笔记:Echarts地图 被选中更改颜色一系列配置
- 常见的几种开源镜像仓库介绍
- 【汇正财经】证券市场的结构有哪些?
- Apache Commons Collections包和简介
热门文章
- 对日面试的42个问题,你会吗?
- 专转本-计算二级习题3
- http劫持如何解决,劫持软件怎么办?
- Oracle求近7日累计值和去年同期值
- 怎样做好仓库管理?必须记住这八条!
- 接住喽????,送你个装逼的技能: JDK动态代理
- Python:PIL图像处理库绘制国际象棋棋盘
- UG NX 10.0 永久关闭连续自动标注尺寸
- 以壬寅岁末,敬颂冬绥,癸卯甫至,奋楫笃行,写一篇给技术保障团队的感谢信,不少于五百字。...
- cocos creator require报错Error: Cannot find module ‘./xx‘