Verilog System Verilog 详细语法知识点
1. 状态机相关的verilog要熟悉.2. force 和release 用法代码示例force ah33; #200ns; release a;force的作用相当于给模块的接口强制赋值了一个值release的作用相当于把force这个强制条件解除了2.1 force与$deposit()在赋值上的区别在仿真环境中$deposita, 1与force a 1都是用于给信号赋值的语句但两者在行为上有明显的区别。$deposit用来设定信号的初值并且这个值在后续仿真中可以被DUT设计单元内部信号的更新所覆盖比如在触发时钟后信号可以被更新而force则相当于对信号施加强制行为这种赋值具有更高的优先级直到释放release为止强制赋值不能被DUT内部的更新覆盖。具体来说$deposit可以被视为对信号的一个初始设定但它允许电路逻辑在后续的仿真中更改这个值相对而言force赋值则如同一把锁一旦施加信号的值便保持不变直到显式地释放。3. 按位运算符相关的操作按位取反~按位与 按位或 |按位异或^ , 按位同或~^ab0111, bb0101, cb1111; ~ab1000; ~bb1010; a0; b0; c1; a b b0101; a|b b0111; a^b b0010; a^ ~bb1101;原来有几位结果就有几位位数不匹配的高位补0或者符号位。4. 逻辑运算符操作逻辑与 逻辑或|| 逻辑非 结果为0或1。inb1101; out !in; //out0; out ~in; //outb0010 比较二值逻辑 比较四值逻辑。5. assign wirereg;在assign语句中左边信号为wire类型右边信号为reg类型。连续赋值assign语句独立于过程块所以不能在always和initial过程块中使用assign语句。6. always *begin 语句块 end 用法只要敏感列表信号*发生变化就会执行语句块内容。*是clk时对应的电路是D触发器。7. generate的用法generate语句可以动态地生成verilog代码generate_if generate_casegenerate if(ab) assign d ab; else assign d a|b; endgenerate8. 如果case语句中没有default会怎么样9. 打印格式%e: 以指数的形式输出实数%3.2f: 以十进制的形式输出实数。10. define parameter local 在使用上的区别11. while中 break和continue的区别while(1) { }不断地重复执行{}内的循环体while(1)是死循环会一直执行循环体除非循环体内设有breakbreak和continue的区别: continue语句只结束本次循环而不是终止整个循环的执行。而break语句则是提前结束整个循环过程不在判断执行循环的条件是否成立。12. initial和always语句块initial不可综合always可以综合。initial是为测试而生只能用于测试只执行一次always语句从0时刻开始可以重复执行各always块并行执行initial语句也是从0时刻开始只执行一次各initial语句并行执行只有reg类型的信号才可以在always和initial语句中赋值。在task()中不能出现always和initial过程块。13. define undefine从宏定义开始到 undef 这一句才是宏定义的作用域,这样可以用来精准地控制宏定义的适用范围;不然默认情况下该宏定义的范围则为定义开始的语句到文件尾。14 .为事件控制加入一个iff限定符(posedge clk iff(vld));do_something;仅在有上升沿同时vld有效的情况下才会向下执行“do_something”进程。15. 内建函数$realtime: real型的仿真时间会自动缩放到timescale所定义的实践单位16. 阻塞赋值的意义和目的是为了什么阻塞赋值 顺序执行串行语句非阻塞赋值 并行执行并行语句。17.如果case语句中没有default会怎么样18. 为啥要用logic代替wire和reg, 有啥优点19. logic 和bit赋值上的区别在interface中logic直接赋值不起作用,换成bit后能正常赋值。20.$clog2是Verilog-2005标准新增的一个系统函数用于计算输入整数的以2为底的对数并向上取整。例如3 $clog2(8); $clog2(n)的参数n必须为整数否则会报错所以我们用的时候如果n是浮点型的需要使用int’(n)转换一下然后转换的规则是四舍五入。21. define和parameter的区别22. 逻辑右移和算数右移的区别逻辑右移时总是在左边MSB填充0适用于无符号数。算数右移时在左边填充当前符号位的值0或1适用于有符号数。23. 有符号数和无符号的区别二、SV1.关于约束的重载有2种方式class transaction extends uvm_sequence_item; ...... constraint crc_err_cons{ crc_err 1b0 } endclass第1种在异常测试用例中先实例化trans new();再关闭约束trans.crc_err_cons.constraint_mode(0);再用随机发送宏uvm_rand_send_with(trans, {crc_err dist { 02, 11};})第2种从transaction类派生一个新的类new_transaction, 在新类中对父类的同名约束进行重载在异常测试用例的body()中用新类随机化发送uvm_do(ntr)。22. class 和module的不同点在class中所有的变量默认是动态的在module中所有的变量默认是静态的。23. field automation 机制24 task()中如果要传参数clk 并检测翻转次数那么应该用task(ref logic clk_w); 因为ref表示引用传递clk_w成为外部实参的别名类似指针。外部信号的变化会直接反映到clk_w上。因此posedge clk_w;可以正常工作它会等待外部时钟的上升沿。外部信号必须声明为logic、reg、bit等变量类型。如果时钟是wire类型不能直接用ref传递会报错。建议 task 加automatic尤其是使用ref时避免静态存储导致并发调用冲突。但是呢class类中的task默认就是automatic所以automatic可写可不写。25. 如果 是task(logic clk_w); 调用 task 时实参的值被复制到局部变量clk_w在 task 执行过程中clk_w只是一个局部副本不会跟随外部信号变化。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →