注释、语法规则、操作符的含义、强制类型的转换、流程控制
一、语法规则
和verilog一样(大小写敏感、空格不忽略)
数据格式 <size>'<base><number>
二、操作符
& | 按位与/缩减与 | ^ | 缩减异或 | |
&~ | 按位与非 | ~^ | 缩减同或 | |
~& | 缩减与非 | ?: | 三元操作符 | |
| | 按位或/缩减或 | {} | 拼接符 | |
|~ | 按位或非 | |||
~| | 缩减或非 | |||
=== | 条件等于 | == | 逻辑等于 | |
!== | 条件不等于 | != | 逻辑不等于 | |
==? | 通配符条件等于 | |||
!=? | 通配符条件不等于 |
三、自定义类型和类型强制转换
使用typedef为一个数据类型创建符号
使用<tyoe>'(<value>|<variable>)
Type Casting
阻塞赋值: =
非阻塞赋值:<=
type'(expression)
四、顺序控制
条件:if...else, ?, assert(), case endcase
verilog中循环变量必须在for语句之外声明,当前循环与其他语句相互影响
systemverilog可以在for循环内部声明循环变量,变量为本地唯一,与外部同名变量不冲突,本地循环变量都是自动化的(automatic)
循环:repeat(expr),for(),foreach(expr),while,do...while,break,continue
五、等待语句:@,wait,#
@ event_expression
等待事件发生才继续执行后面的程序
event_expression可以是信号变量、上升沿、下降沿、事件变量
wait(exoression):不可综合
延迟信息
#2:延迟2个仿真时间单位('timescale 1ns/100ps),不可综合
六、verilog task和function
task
task含有input、output、inout语句
task消耗仿真时间
延迟:#20
时钟周期:@(posedge clock)
事件:event
task task_name; parameters input declarations output declaeations reg declaeations ...text body... endtask |
function
函数执行不消耗仿真时间
函数中不能有控制仿真时间的语句
不能有仿真时间延迟:#100 ('timescale 1ns/10ps)
不嫩有阻塞语句:@(posedge clk) 或者 wait(ready)
不能调用task
void function没有返回值
Verilog function必须有一个返回值
funtion [range] funtion_name; parameters input declarations reg declaeations ...code body... endfunction |
tasks和function
不需要使用begin...end语句
增加了return语句
void function没有返回值
function可以有output和inout作为形式参数
return 语句
Systemverilog 增加了return语句
return语句执行时返回表达式的值,否则最后返回数值赋值给函数名
return语句用于退出task和function
使用引用(reference)替代复制的方式传递参数
常见的向task和function传递参数值的方法是复制
使用引用的方式显示的向任务和函数传递参数
关键字是:ref (取代了input,ouput或者inout)
只有自动(automatic)任务和函数才能使用ref参数
七、系统函数:随机化 randomization
$random(seed);//传递参数seed,返回一个32-bit的有符号随机数
$urandom(seed);//传递参数seed,返回一个32-bit的无符号随机数
$urandom(min,max);//生成有一定范围的无符号随机数
randcase...endcase//选择有权重的可执行语句