当前位置:首页 > > 处芯积律

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:

logic [31: 0] a_vect;logic [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,删之






本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭