一些基本常用的仿真语句,写的不多,大部分都是拷贝方式比多,所以有时还比较纠结

1 /***********************************************************************************************************************************/
2 
3 //for循环
4 integer i;
5 for(i=0; i<8; i= i+1)begin
6     data = i;
7 end
8 
9 /***********************************************************************************************************************************/
1 /***********************************************************************************************************************************/
2 
3 //随机数
4 data = $random;                 //产生随机数,产生的随机会根据信号data的位宽自动确认范围
5 data = $urandom_range(min,max); //生成min到max范围内的随机无符号整数 
6 data = $random % 10;            //产生10以内的随机数
7 
8 /***********************************************************************************************************************************/
1 /***********************************************************************************************************************************/
2 
3 //避免在综合时被优化,添加特殊注释语句“/* synthesis keep*/”,注意这个特殊语句只对wire类型有效
4 
5 wire dout_vld/* synthesis keep = 1*/;  //添加synthesis keep后,dout_vld就不会被SignalTab给优化
6 
7 reg[7:0] data_in/* synthesis preserve = 1 */; 
8 
9 /***********************************************************************************************************************************/
1 /***********************************************************************************************************************************/
2 
3 //强制赋值操作,最后必须释放,需配对操作
4 force u1_inist.xx = 8'haa;    //强制赋值
5 release u1_inist.xx;        //释放
6 
7 /***********************************************************************************************************************************/
1 /***********************************************************************************************************************************/
2 
3 //时间精度
4 `timesclae 1ns/1ns            //注意格式,没有结束分号, 单位和精度之间是用的 反斜杠 
5 
6 /***********************************************************************************************************************************/
 1 /**************************************************/
 2 //建议还是加begin end ,后面写就不容易出错
 3 initial begin
 4         clk = 0;
 5         forever begin            
 6             #(CLK_CYCLE/2);
 7             clk = ~clk;
 8         end
 9 end
10 /**************************************************/
11 //不加begin end ,在(CLK_CYCLE/2)这个地方不能加分号,
12 //因大部分都是拷贝比多,时间长了忘记细节了,就有时考虑要不要加分号了,很痛苦
13 initial begin
14         clk = 0;
15         forever #(CLK_CYCLE/2) clk = ~clk;
16 end
17 /**************************************************/
 1 /**************************************************/
 2 initial begin
 3     #1;            //先加一个延迟,保证建立时间,避免出现竞争
 4     din_vld = 0;
 5     din = 0;
 6     for(i=0; i<128; i=i+1)begin
 7         din_vld = 0;
 8         #(CLK_CYCLE*10);
 9         din_vld = 1;
10         din = $urandom_range(48, 103);
11         #(CLK_CYCLE);
12         din_vld = 0;
13     end
14 end
15 /**************************************************/

 

1 //parameter 标识符 = (位宽)常数;//位宽默认为32位,如果指定位宽则以指定值为准
2 parameter    NUM    = 4'd8;    
3 reg[8-1:0]    dout;
4 dout <= {NUM{1'b1}};     //等价于 dout <= {8’hff};

 

1 /***************************************************************************************/
2 data[24-:8] <= din[24-:8]; //等价于data[24:17] <= din[24:17];  //第24位往后取8位
3 
4 dout = din[(cnt+1)*4-1-:4];   //当cnt = 0时,dout = din[3:0] ; //往后取4位
5 /***************************************************************************************/

 

1 /*************************************************************/
2 //位拼接注意一定要加上位宽
3 data = {1'b1,4'd3,2'b11,1'b0}; //位拼接必须带上位宽,否则,被拼接的数会被默认为是32位宽
4 /*************************************************************/

 

posted @ 2022-05-20 19:26  MyBooks  阅读(50)  评论(0编辑  收藏  举报