Verilog常数赋值、字符串、标识符

文摘   2024-10-17 11:44   四川  

1.整数赋值

按照Verilog 2005的标准:0-9、a-f、z、x称作数字位(digit);表示数字正负的’+‘和’-‘视作一元操作符(unary operator);常说的二进制、八进制、十进制、十六进制称作数字的基(base);其在Verilog中的表示’b’、‘o’、‘d’、'h’称作基格式(base format)字符;表示常数的bit数称作size。Verilog使用到的字符都是不区分大小写的。

另外要明白二进制数本身的运算规则与一个数是signed还是unsigned、小数点在哪个位置没有任何关系,这些只是设计者人为的规定。但是在代码设计时,要标识清楚数据是signed或unsigned,目的有两个:(1).对设计者的提示;(2).一些操作符、IP核的数据端口,对数据是signed或unsigned的“身份”有要求。

如果一个数是负数(前面加了’-’),那么它必定采用的是二进制补码形式。

方式1

常数赋值有两种,一种为直接赋值(符号+一串数字位),采用这种方式赋值时,默认数据是sigend形式。如下面一个简单的示例:

module test
(
input clk,
output reg [31:0] c
);

wire [31:0] a, b;

assign a = -595;
assign b = -10;

always @ (posedge clk)
c <= a + b;

endmodule

对两个带符号数做加法运算,结果仍然是带符号数,Vivado中仿真时,将Radix设置为Signed Decimal,可以看到变量C的结果为-605。

方式2

另一种则是常见的基常数赋值方法(符号+size+单引号+基格式字符+一串数字位),如"assign a = +16’d53;", 符号和size是可有可无的。

如果在基格式字符(b、o、d、h)前加上’s’,表示这是个带符号数signed;没有加’s’则表示是不带符号数unsigend。如果前面加了符号位“-”,会自动用二进制补码的形式。

如下面的简单示例:

`timescale 1ns / 1ps

module test
(
input clk,
output reg [31:0] c
);

wire [31:0] a, b;

assign a = -32'd595; // 加上size,省去s
assign b = -'sd10; // 省略size,加上s

always @ (posedge clk)
c <= a + b;

endmodule

仿真结果与第一个示例相同。

位宽扩展

这里先不讨论将低位宽的数据赋值给高位宽数据的问题,比如将12bit的a赋值给16bit的b。先讨论直接将低位宽的常数赋值给高位宽的数据时,位宽扩展遵循怎样的标准(不考虑x和z)。

以下面的测试代码为例,将12bit的常数赋值给16bit的数据:

wire [15:0] a = 12'd565;
wire [15:0] b = -12'd565;
wire [15:0] c = -12'sd565;
reg [15:0] d = -12'sd565;

仿真结果如下,分别展示了赋值结果的2进制和10进制:

对于正数,赋值结果为高位补0。对于负数(二进制补码),无论是reg还是wire型、加s声明为带符号数或者不加s,结果都是高位补符号位。可见位宽扩展只与数据的正、负有关。Verilog HDL的位宽扩展机制可以确保设计者安全、便捷地完成程序设计。

“负数”与“带符号数”的区别

由于负数必须需要符号’-'来规定,所以第一感觉就是将负数和带符号数二者等同。其实两者并不完全相同,如果只加负号,不加s,虽然软件工具会将其用二进制补码表示,但仍不会将其当作带符号数signed看待。看下面的示例代码:

module test
(
input clk,
output reg [15:0] a,b,c,d
);

always @ (posedge clk) begin
a <= -12 / 3;
b <= -'sd12 / 3;
c <= -'d12 / 3;
d <= -4'sd12 / 3;
end

endmodule

仿真结果如下图:

  • 对于a:在没有规定大小和基格式时,-12和3都视作带符号数,因此结果为正确的-4;

  • 对于b:-'sd12使用字符’s’声明这是个带符号数,结果同样是正确的-4;

  • 对于c:-'d12虽然声明这是个负数,但没有加-s,软件仍然不会将其视作带符号数,运算结果与预期不符;

  • 对于d:-4’sd12同时还指定了大小,但4’sd12已经超过了4bit带符号数的表示范围,它的值12(1100)实际意义上是-4(最高位符号位表示负数,二进制补码),前面再加’-'为正4,除以3,近似为整数后值为1。


2.实常数赋值

Verilog HDL本身是支持在代码中使用小数、科学计数法的,只不过赋值给整数型数据时,会发生隐式转换,转换为整数。看下面的示例:

wire [15:0] a = 1e4;
wire [15:0] b = 12.1;
wire [15:0] c = 12.5;
reg [15:0] d = -12.5;

仿真结果如下:

数据a用科学计数法进行赋值。隐式转换的规则是:(1). 转换为最接近的整数;(2).中间值.5转换时,向远离0的方向进行。如数据c,12.5 => 13;数据d,-12.5 => -13。


3.字符串(String)

Verilog HDL同样也支持字符串的使用,使用双引号“”表示字符串内容,一个字符串必须放在一行内。在表达式和赋值语句中使用字符串,工具会将其视作无符号整数,一个字符对应一个8bit的ASCII码。

\n、\r、\t、\\和\"等常用的转义字符,Verilog HDL也同样支持。

下面是一个简单的测试代码:

module test
(
input clk,
output reg [8*4-1:0] c,
output [8*4-1:0] d
);

assign d = "CUIT";
always @ (posedge clk)
c <= "CUIT";

endmodule

仿真时可以看到,无论是reg还是wire类型,其存储的值本质都是“32’h43554954”,是一串ASCII码的组合。

设计仿真激励文件时,字符串更多是一种让仿真结果更直观的辅助手段(如用在$display系统任务中)。硬件设计中也有一定用处,如在一些通信协议的设计中,直接使用字符串操作会便捷很多,起码不用对着ASCII码表查找。

由于字符串的本质仍然是无符号整数,因此Verilog的各种操作运算对字符串也适用。比如用==和!=进行字符串的比较、用{ }完成字符串的拼接。不过需要注意:当字符串赋值的对象位宽较大时,左边会做补0处理,这样会对字符串的比较、拼接造成影响,结果可能与我们的预期不符,如下面示例代码:

module test
(
input clk,
output reg [7:0] a,b,c,d
);

reg [8*8-1:0] s1 = "Hello", s2 = " World!";
reg [8*5-1:0] s3 = "Hello";
reg [8*7-1:0] s4 = " World!";

always @ (posedge clk) begin
if ({s1,s2} == "Hello World!")
a <= 1'b1;
else a <= 1'b0;

if ({s3,s4} == "Hello World!")
b <= 1'b1;
else b <= 1'b0;
end

endmodule

看起来s1和s2的拼接、s3和s4的拼接结果都应该是“Hello World!”,但仿真结果如下:

!

事实上,s1和s2进行字符串赋值时先要高位补0,再拼接后的值已经不是单纯的“Hello Wrold!”。s3和s4的位宽正好与字符串长度相等,赋值时没有补0,因此比较结果相等。

ASCII码有个特殊的字符NUL,含义为空,码值为0。Verilog字符串中使用("")或("\0")都是表示NUL的含义,不会占据实际的存储空间。比如 reg [5*8-1:0] = “Hello\0”; 和 reg [5*8-1:0] = “Hello”; 的含义完全相同。


4.标识符(identifier)

常说的“数据名”、“变量名”,在标准中的规范名称应该是“identifier”。常见的标识符由字母、数字、$、下划线组成,其中数字和$不能是标识符的第一个字符。

标识符其实有“最大长度限制”,不同软件可以自行规定,不过这个限制值最小也有1024个字符。

这里专门提到标识符,是想记录一下比较陌生的转义标识符(escaped identifier),不过一般也用不到Verilog的这个特性。

一般的标识符对使用到的字符有限制,转义标识符可以使用所有可显示的ASCII字符。转字标识符必须以’\'为开头以空格、Tab键盘、换行其中之一为结尾

看下面的简单示例代码,注意表达式和赋值语句的分号前都加了空格:

module test
(
input clk,
output [23:0] c,
output d
);

reg \75 ;
reg [23:0] \{a+b} ;
reg \always ;
reg \flag ;

always @ (posedge clk) begin
\75 <= 1'b1;
\{a+b} <= 23'd565;
\always <= 1'b1;
flag <= 1'b0;
end

assign d = \75 ;
assign c = \{a+b} ;

endmodule

如果转义标识符中没有用到其它特殊字符,则本质上仍然是一般的标识符。上面的代码中,定义时为 \flag,使用时直接用 flag 即可。

有个特殊情况,就是转义字符直接使用Verilog HDL中保留的关键字,如上面的 \always,不过使用时前面的’\'不能省略。

景芯SoC v4.0芯片全流程实战


终身辅导、一对一辅导是景芯SoC训练营的特色!

手把手教您搭建SoC,从入门到进阶,带您掌握架构、算法、设计、验证、DFT、后端全流程低功耗!直播视频不定期升级!让您快速超越同龄人!

报名微信:13541390811


景芯全流程课程如下:

  • 景芯SoC设计  视频+文档+实战+一对一终身辅导(视频免费无期限)

  • 景芯SoC验证  视频+文档+实战+一对一终身辅导视频免费无期限

  • 景芯SoC中端  视频+文档+实战+一对一终身辅导视频免费无期限

  • 景芯SoC后端  视频+文档+实战+一对一终身辅导视频免费无期限


进阶课程:

  • 12nm 2.5GHz A72 低功耗DVFS实战培训(价格不到同行1/2)

  • DDR4/3项目实战培训(价格不到同行1/2)



小编逐步将教程、芯片设计全流程知识公布在知识星球,包括设计、验证、DFT、后端全流程知识以及大量技术文档,如果你和我一样渴求知识,不惧怕全流程的知识爆炸,那么欢迎您加入讨论学习,共同进步!



景芯主营业务是design service+一对一芯片辅导培训!


另外小编团队提供芯片Design Service,设计服务包括:

  • 提供SoC、MCU、ISP、CIS等芯片设计、验证、DFT设计服务

  • 提供DDR/PCIE/MIPI/CAN/USB/ETH/QSPI/UART/I2C等IP设计

  • 提供7nm、12nm、28nm、40nm、55nm、65nm、90nm等后端设计

  • 提供高校、企业定制化芯片设计服务、设计培训业务


景芯SoC v4.0芯片全流程实战训练营的宗旨:

手把手教您掌握SoC算法、设计、验证、DFT、后端全流程低功耗!


景芯SoCv3.0,是一款用于【芯片全流程实战培训】的低功耗多媒体SoC!

景芯SoC系统分为三个层次的功耗管理,并集成低功耗RISC-V处理器,集成ITCM SRAM、DTCM SRAM,集成MIPI、ISP、USB、QSPI、UART、I2C、GPIO等IP,采用SMIC40工艺流片。



(一)SoC设计课程,您将学会
  • 高速接口的Verilog设计实现
  • 从图像算法到RTL设计实现
  • MIPI、ISP的Verilog实现与仿真
  • Lint、CDC检查及UVM验证
  • SoC子系统的C驱动仿真
  • 后仿真
仅设计一门课程内容就抵得上其他培训机构的5-6门课程,价格仅其1/6

(二)SoC验证课程,您将学会
  • SoC子系统级的UVM环境搭建
  • SoC子系统级的UVC环境搭建
  • SoC子系统级的VIP环境搭建
  • SoC子系统的DMA SRAM UVM联合验证
  • SoC子系统的UART UVC验证
  • SoC子系统的长包、短包、超长包、毛刺包、包头/包尾错误UVM验证

仅验证一门课程内容就抵得上其他培训机构的3-4门课程,价格仅其1/6


(三)SoC中端课程,您将学会
  • DFT设计(芯片级)
  • Synthesis逻辑综合(芯片级)
  • 低功耗UPF设计、CLP技术
  • formal验证等技术

仅中端一门课程内容就抵得上其他培训机构的4-5门课程价格仅其1/6

(四)SoC后课程,您将学会

  • 低功耗设计

  • 布局布线(低功耗FF flow)
  • StarRC/QRC
  • STA/Tempus
  • 功耗分析
  • DRC/LVS设计

仅后端一门课程内容就抵得上其他培训机构的3-4门课程,价格仅其1/6



课程提供服务器供大家实践!带你从算法、前端、DFT到后端全流程参与SoC项目设计。请联系号主报名!联系微信:135-4139-0811

景芯SoC训练营图像处理的数据通路:



一键式完成C代码编译、仿真、综合、DFT插入、形式验证、布局布线、寄生参数抽取、STA分析、DRC/LVS、后仿真、形式验证、功耗分析等全流程。升级后的芯片设计工程V4.0 flow如下:


SoC一键式执行flow



MIPI DPHY+CSI2解码


数字电路中经典设计:多条通信数据Lane Merging设计实现

数字电路中经典设计:多条通信数据Lane Distribution实现




景芯SoC验证架构


景芯SoC全芯片验证架构:


景芯资深老学员告诉我,留学X国的硕士去外企某芯片巨头薪资是20万+美金!折合RMB超过140万,才25岁左右的小伙子!薪资超140万!


小编去看了glassdoor的工资:

1-3经经验的ASIC Engineer的工资报价有212K美刀,20万美刀。

7-9年经验的ASIC Engineer的工资报价有311K美刀,30万美刀。

当然具体薪资也是看每个候选人的水平以及岗位匹配度。

学历、项目经验都是非常重要的,期待着景芯战友们的更多捷报!走出国门,世界更精彩!景芯SoC项目的正能量之大,小编自己都很震撼,小编一定持续打磨,让景芯战友们一起成功!


景芯SoC UPF低功耗设计

全芯片UPF低功耗设计(含DFT设计)


景芯SoC训练营培训项目,低功耗设计前,功耗为27.9mW。

低功耗设计后,功耗为0.285mW,功耗降低98.9%!



电压降检查:


低功耗检查:


芯片的版图设计V1.0


芯片的版图设计V2.0


芯片的版图设计V4.0


低功耗设计的DRC/LVS,芯片顶层的LVS实践价值极高,具有挑战性!业界独一无二的经验分享。




ISP图像处理

  •    dpc - 坏点校正


  •    blc - 黑电平校正 


  •    bnr - 拜耳降噪

  •    dgain - 数字增益 

  •    demosaic - 去马赛克


  •    wb - 白平衡增益 

  •    ccm - 色彩校正矩阵 

  •    csc - 色彩空间转换 (基于整数优化的RGB2YUV转换公式)

  •    gamma - Gamma校正 (对亮度基于查表的Gamma校正)

  •    ee - 边缘增强


  •    stat_ae - 自动曝光统计 

  •    stat_awb - 自动白平衡统计


CNN图像识别


支持手写数字的AI识别:

仿真结果:仿真识别上图7、2、1、0、4、1、4、9



景芯SoC 3.0 ISP:



景芯SoC V3.0 DFT方案:




如果您和小编一样渴求进步,想掌握芯片设计全流程,欢迎加入小编知识星球,疯狂成长,一起进步!早日成为芯片大佬!


景芯学员们,小编十分感谢你们对景芯的肯定、信任和支持,你们的鼓励让小编十分感激,小编一定更努力精心打磨景芯SoC实战课,我承诺,一定要做到零差评,让大家无论资深还是资浅都能从景芯训练营获得成长!




以上就是今天分享的内容,如果您和小编一样渴求进步,想掌握芯片设计全流程,欢迎加入小编知识星球,疯狂成长,一起进步!早日成为芯片大佬!


景芯SoC V3.0课程提供服务器供大家实践!手把手教您学会SoC的算法、前端、DFT、后端全流程实战。


请联系号主报名!联系微信:135-4139-0811


景芯SoC训练营图像处理的数据通路:

景芯SoC的CRG设计:


一键式完成C代码编译、仿真、综合、DFT插入、形式验证、布局布线、寄生参数抽取、STA分析、DRC/LVS、后仿真、形式验证、功耗分析等全流程。升级后的芯片设计工程V2.0 flow如下:


SoC一键式执行flow



MIPI DPHY+CSI2解码


数字电路中经典设计:多条通信数据Lane Merging设计实现

数字电路中经典设计:多条通信数据Lane Distribution实现





UPF低功耗设计

全芯片UPF低功耗设计(含DFT设计)


景芯SoC训练营培训项目,低功耗设计前,功耗为27.9mW。

低功耗设计后,功耗为0.285mW,功耗降低98.9%!



电压降检查:


低功耗检查:


低功耗设计的DRC/LVS,芯片顶层的LVS实践价值极高,具有挑战性!业界独一无二的经验分享。



丰富的教程文档



景芯训练营有同学问如何给IO添加PAD?请思考景芯SoC的IO和PAD如何实现最佳?



SoC训练营VIP学员问为何低功耗cell没有插入网表?

虽然提问题是值得鼓励的,但是我们在遇到问题时,还是先主动思考,主动解决问题,实在解决不了我们再求助,这样成长更快。

首先,小编拿到这问题,就打开log,查看log是一种IC设计美德!发现EDA工具吃进UPF文件后,报了warning如下,用到了很多ff库。

上图报错UPF指定电压是0.99V,而CELL是1.20V,电压不匹配,导致逻辑综合出来的网表没有插入MV CELL。注意,综合时,我们用的ss库,怎么会是ff库呢?打开约束脚本发现如下bug:

于是,更改约束,将ff换成ss即可。再次run一下,结果就出来了:

低功耗设计部分,设计里面我会留一点小bug在里面 非常简单,我不会公布答案,大家一定要多思考、多动手跑跑,这样才学的深刻。


培训学员请注意,景芯SoC用always on的power domain电压域的pwrdown_mux信号作为power switch cell的switch控制信号,但是设计里面有个小问题,不太算bug的bug,但对upf低功耗flow而言,毫无疑问就是bug!

培训学员请登陆服务器追踪一下pwrdown信号,注意其负载情况,RTL代码如下:

结合PR输出的netlist, 我们做个clp低功耗检查,脚本参见服务器。可以发现,clp报错说power switch的switch控制信号找不到。

不得不说,clp检查对低功耗而言多么重要,对芯片设计而言多重要!景芯SoC的价值就在把芯片设计全流程的这些细小的知识点,全部串接起来!犹豫啥?抓紧报名加入吧!


在芯片设计中端流程时,景芯SoC会插入UPF约束中的isolation等cell,但是无法插入power switch等cell,因此,作为power switch cell的控制信号pwrdown_mux在没有负载的情况下,会被裁员掉(优化掉),因此需要设置上面MUX器件为dont_touch或者使pwrdown_mux成为module的port并禁止auto_ungroup(并设置no_boundary_optimization),这样这个信号才能保留给后端,供后端实现power switch控制。请学员完成代码修改,基于全套flow环境完成如下任务:

  1. lint检查、前端仿真,

  2. 完成中端、后端flow,

  3. 完成clp检查, 完成后仿真


景芯训练营有同学问,同样的floorplan,有些同学很快跑完,有些同学则遇到大量DRC问题(EDA工具不停iteration)导致工具始终无法跑完,具体什么问题呢?


首先,小编发现该同学的stripe把TM2定义为了horizontal,而熟悉景芯工艺的同学知道,TM2的preference direction是VERTICAL。


查询景芯的lef库文件也可以确认:


用错方向有多大影响呢?大家上景芯SoC的后端flow实践一下吧,实践出真知。


景芯训练营有同学问,为啥PR花了一天一夜24个小时完成布线还大量DRC错误?小编已经将设计规模尽可能减小以加速PR设计,实际上2小时就可以跑完routing,为何这么慢?原因就是低功耗单元的走线。具体原因及解决办法欢迎加入景芯训练营讨论。


其错误主要集中在M4上,请思考如何解决。


景芯训练营有同学问,power switch cell的secondPG pin(VDDG)从M1接出的,而不是M2, 请思考有什么问题?如何解决?


景芯训练营有同学问,景芯SoC培训营同学遇到Corner Pad LVS不过怎么处理?


完成景芯SoC培训的前端设计仿真、DFT后,我们来到后端flow,本教程教你一键式跑完数字后端flow。

生成脚本命令如下:

tclsh ./SCRIPTS/gen_flow.tcl -m flat all


生成flow脚本之前需要配置setup.tcl等相关参数,具体参见【全网唯一】【全栈芯片工程师】提供自研的景芯SoC前端工程、DFT工程、后端工程,带你从算法、前端、DFT到后端全流程参与SoC项目设计。


景芯SoC训练营的同学问,为何innovus读取做好的floorplan def文件报Error? 首先看log:


Reading floorplan file - ./data_in/DIGITAL_TOP.def (mem = 1595.0M).

#% Begin Load floorplan data ... (date=10/23 22:38:01, mem=1579.3M)

**ERROR: (IMPFP-710): File version unknown is too old.


以前EDI的时期,我们可以通过定义fp_file的方式来加载floorplan:

set vars(fp_file)        "./data_in/DIGITAL_TOP.def"


但是现在innovus升级并放弃了fp_file的加载方式,当然也可以用老版本的EDI9.1及以前版本来加入fp_file,然后转存为新版本,这方式明显没有必要。正如下log提示所说,检查log是非常好的工程师习惯。


Input floorplan file is too old and is not supported in EDI 10.1 and newer.

You can use EDI 9.1 and before to read it in, then save again to create new version.


小编的直觉告诉我,先去看看同学保存的def文件是哪个def版本?

同学保存方式如下:


那么请问如何解决?请大家加入景芯训练营实践。

景芯SoC用了很多异步FIFO,关注异步RTL实现的同学,可以抓取异步FIFO出来看一下版图连线:

查看下所有异步FIFO cell的面积;

dbget [dbget top.insts.pstatus unplaced -p].area

查下所有异步FIFO的cell的名字:

dbget [dbget top.insts.pstatus unplaced -p].name

那么怎么抓出异步路径来观察版图走线呢?如何让report_timing呢?更多内容参见知识星球和SoC训练营。


以上就是今天分享的内容,如果您和小编一样渴求进步,想掌握芯片设计全流程,欢迎加入小编知识星球,疯狂成长,一起进步!早日成为芯片大佬!


欢迎加入SoC MCU全流程设计交流群,先加我微信,验证岗位后进群!

SoC MCU全流程设计交流群4

SoC MCU全流程设计交流群3

SoC MCU全流程设计交流群2

SoC MCU全流程设计交流群1


欢迎加入CMOS图像传感器+ISP交流群,先加我微信,验证岗位后进群!

CMOS图像传感器+ISP交流群2

CMOS图像传感器+ISP交流群1





全栈芯片工程师
十多年SoC、MCU、ISP、CIS芯片设计经验!为客户提供优质的design service!研究生毕业于电子科大,曾就职海思,后加入创业公司任芯片设计经理,创办了景芯SoC全流程芯片设计培训营!
 最新文章