记录SystemVerilog和Gvim的几个语法
扫描二维码
随时随地手机看文章
1
SystemVerilog
1. vector向量的bit-select和part-select寻址
向量的bit-select是从vector、packed array、packed structure、parameter或concatenation变量中选取某1-bit。用于寻址bit的index如果超出变量范围或有x态或有z态,那么对于4-state bit则返回x,对于2-state bit则返回0。对于scalar、real变量和real参数进行part-select是无效的。
Example:
logic [2:0] abc;abc[1] = 1’b1; // bit-select
向量的part-selects是指寻址几个连续的bits,可分为non-indexed part select和indexed part-select两种类型。
non-indexed part select语法如下:
vect[msb_expr:lsb_expr]
其中msb_expr和lsb_expr必须是常数整型表达式。
Example:
logic [2:0] abc;abc[2:1] = 2’b1; // non-indexed part select
indexed part-select语法如下:
logic [15:0] down_vect;logic [0:15] up_vect;down_vect[lsb_base_expr +: width_expr]up_vect[msb_base_expr +: width_expr]down_vect[msb_base_expr -: width_expr]up_vect[lsb_base_expr -: width_expr]
其中msb_base_expr和lsb_base_expr必须是整型表达式,width_expr必须是正常数整型表达式。msb_base_expr和lsb_base_expr在运行时可以变化。part-select的位宽等于width_expr。
Example:
logiclogic [0 :31] b_vect;logic [63: 0] dword;integer sel;a_vect[ 0 +: 8] // == a_vect[ 7 : 0]a_vect[15 -: 8] // == a_vect[15 : 8]b_vect[ 0 +: 8] // == b_vect[0 : 7]b_vect[15 -: 8] // == b_vect[8 :15]dword[8*sel +: 8] // variable part-select with fixed width
当part-select部分超出变量范围或part-select是x态或z态的话,那么对于读,对于超出的部分返回x态,对于写,只有在范围内的bits才会生效。
2. SV多态的演示
3. task和function的参数
有如下类型参数:
input // copy value in at beginningoutput // copy value out at endinout // copy in at beginning and out at endref // pass reference
task/function的参数列表中,定义为output类型的不能带default value。
task/function的参数列表中,如果以ref传递object handler,那么在subroutine里改变了object handler(这里是指句柄,而不是object内容),外部的也会被改变了。如果以input传递的,那么在subroutine里改变了object handler,外部不会改变。所以,为了预防传入的object handler被改变了,可以在ref前面加上const,这样只能改变object内容,而不会把object handler变了。
4. In-line随机变量控制
在使用class.randomize()的时候,可以在randomize()的括号里直接加入class的变量名,这样表示是对指定的变量名进行随机,而把该class的其他变量当作state变量,也就是保持值不变。
Example:
class CA; rand byte x, y; byte v, w; constraint c1 { x < v && y > w );endclassCA a = new;a.randomize(); // random variables: x, y; state variables: v, wa.randomize( x ); // random variables: x; state variables: y, v, wa.randomize( v, w ); // random variables: v, w; state variables: x, ya.randomize( w, x ); // random variables: w, x; state variables: y, v
此外,如果多个变量在constraint里存在约束关系,那么就算是单个变量随机情况下,也符合该约束的。
5. interface的clocking
clocking drv_cb @(posedge HCLK); default input #1step output #0; output test;endclockingclocking drv_cb1 @(posedge HCLK); default input #1step output #2ns; output test_1;endclocking
ahbp_if.drv_cb.test <= cnt; // cb的赋值是马上生效的,即cnt和drv_cb.test的值立马一致,但是ahbp_if.test的值需要跟着output #0来驱动的。比如下面的例子。
ahbp_if.drv_cb1.test_1 <= cnt; // 这个例子的ahbp_if.test_1的值是在执行到这条语句的2ns后才会送到ahbp_if.test_1端口上的。
如下这个波形和log。
6. ===、!==、==、!=的区别
===和!==的结果是确定的,要么0,要么1。该符号是把x和z都拿进去比较的,如果两边不相等,那么结果为0,如果全等,那么结果为1.
==和!=结果可能会有x态或z态。该符号是不比较x或z的,一旦rhs或lhs出现x或z,那么比较的最终结果就是x。在没有x或z之后,两边相等则结果1,两边不相等则结果为0.
if(expresion)和while(expression)中,expression必须为1才执行,如果expression为x或z,那么都认为是false的。但如果expression是个多bit的,如果多bit中有为1的bit,那么不管其它bit是x或z,都是True。
7. generate嵌套问题
generate可以嵌套,但只需要外部写上generate,内部的嵌套不需要写上generate的。
2
Gvim
1. 删除每行前10个字符:
:%s/^.\{10\}//
# 其中,%表示所有行,s表示替换,"%s"可用"1,$"代替(下同);正则表达式"/^.\{10\}//"中,^表示行首;"."表示要删除的字符个数,".\{10
\}"表示删除10个字符,可用10个"."表示;
2. 删除每行后10个字符:
:%s/.\{10\}$//
# 其中,"$"表示行尾,其他同上
3. 在每行行首添加相同的内容:
:%s/^/要添加的内容
4. 在每行行尾添加相同的内容:
:%s/$/要添加的内容
5. 显示TAB键
:set list TAB
# 文件中有 TAB 键的时候,你是看不见的。要把它显示出来,TAB键会显示为 ^I,$显示在每行的结尾,表示换行
6. 删除空格行
:g/^\s*//g
7. 删除行首空格
:%s/^\s*//g
8. 删除行尾空格
:%s/\s*$//g
9. 删除特定字符的某些行
g/pattern/d
# 是找到pattern, 删之
v/pattern/d
#是找到非pattern,删之





