文本值和数据类型
文本值和数据类型
文本赋值增强
parameter SIZE=64;
reg [SIZE-1:0] data ;
data = 0;
data = 'bz ;
data = 'bx ;
verilog可以为变量赋全0,全z和全x,但对赋全1很不方便。只能写成如下形式
assign data = 16'hFFFF ;
assign data = ~0 ; //实现全1赋值
SV除了可以像上述实现全0,全x全z外,'b1可以将变量所有位置1.
数据类型
verilog数据类型
reg/integer/time每一位有0、1、z、x四种逻辑
wire/wor/wand等线网类型每一位有120种值(四态逻辑+多个强度级)
SV数据类型
SV使用logic代替reg
logic [63:0] addr ;//64位四态变量
wire logic [63:0] addr ; //64位四态数据类型
bit、byte、shortint、int、longint主要用在更高抽象级。两台类型也可综合,编译器对两态和四态同样对待,但两态会影响仿真。
另外可综合RTL模型中可使用int类型作为for循环的控制变量。
去掉了verilog对wire、reg使用环境的限制,放宽变量应用
module compare(
output logic lt,eq,gt,
input logic [63:0] a,b);
always @(a,b)
if(a<b) lt = 1'b1;
else lt = 1'b0;
assign ge = (a>b) ;
comparator u1(eq,a,b);
endmodule
module comparator(
output logic eq ,
input [63:0] a, b
);
always @(a,b)
eq = (a==b) ;
endmodule
尽管SV对变量应用有所放宽,但一般还是不允许出现多驱情况,一个变量只能有一个源。
强制类型转换
7+int`(2.0*3.2)//将2.0*3.0结果转换为整型
logic [15:0] a,b,y ;
y=a+b**16`(2)//将文本值2强制转换为16位宽
y=y-signed`({a,b});//将拼接结果强制转换为有符号值
数据类型转换
静态强制转换
可以强制转换,但如果出错工具无法检查。比如s3+1就会超出states_t的范围
typedef enum {s1,s2,s3} states_t;
states_t state,next_state;
always_comb begin
if(state !=s3)
next_state = states_t`(state+1);
else
next_state = s1;
end
动态强制类型转换
int radius,area;
always @(posedge clock)
$cast(area,3.154*radius**2);
typedef enum {s1,s2,s3} states_t ;
states_t state,next_state ;
always_latch begin
$cast(next_state,state+1);
end
转换失败会报错。
静态转换可综合,但综合工具可能不支持动态地$cast。
常数
const logic [23:0] C1 = 7;//24位常数
const int C2 = 15 ; // 32位常数
const real C3 = 3.14 //实数常数
const C4 = 5 //错误声明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】