System Verilog随机和约束

随机数组和队列,约束动态数组和队列
示例1
my_trans.sv文件

class my_trans;
    rand bit [3:0]   s_array[7];//非合并数组
    rand bit [3:0]   d_array[ ];//动态数组,使用rand修饰,每次随机化这个类,这个变量都会赋一个值
    rand bit [3:0]   queue[$];//队列,$代表最后一个元素

    constraint  d_array_cons {d_array.size() > 5; d_array.size() < 10; }//size()内建方法返回数组的当前尺寸
    constraint  queue_cons {queue.size()==3;}//size()返回队列中元素的数目,队列为空返回为0;
    function void display();
        $display("s_array = %p", s_array);//%p各式符输出指针指向的地址值
	foreach (d_array[i])
	    $display("d_array[d_array[%0d] = 0x%0h", i, d_array[i]);
        $display("queue = %p", queue);
    endfunction
endclass

tb.sv文件

module tb;
my_trans trans;//例化
initial begin
    trans = new();//分配空间,产生一个包
    trans.randomize();//调用randomize函数,让rand修饰符起作用随机,并调用约束
    trans.display();
end
endmodule

Makefile文件

TB_FILE_LIST  =  filelist.list

all: clean comp run

COMP = vcs -full64 -sverilog -debug_all -fsdb

SIMV = ./simv

comp:
	$(COMP) -f $(TB_FILE_LIST) 
run:
	$(SIMV) -l simv.log
clean:
	rm -rf AN.DB DVEfiles csrc *.simv *.simv.daidir ucli.key 64
	rm -rf *.log* *.vpd *.fsdb *.vdb novas* *verdi*
	rm -rf simv*

filelist文件

./my_trans.sv
./tb.sv

执行make compmake run命令

s_array = '{'h9, 'hc, 'h7, 'h3, 'hc, 'h4, 'h9} 
d_array[d_array[0] = 0x3
d_array[d_array[1] = 0x4
d_array[d_array[2] = 0x6
d_array[d_array[3] = 0x2
d_array[d_array[4] = 0x9
d_array[d_array[5] = 0xb
queue = '{'h6, 'h9, 'ha} 

示例2
my_trans.sv文件

class my_trans;
  rand  bit    [7:0]      sa;
  randc bit    [7:0]      da;		//port selection
        reg    [7:0]      payload[$];	// data array
        string            name;		// unique identifier
        int               low, high;

  function new(string name = "Packet");
      this.name = name;
      this.sa   = sa;
      this.da   = da; 
  endfunction

  constraint addr_cons { sa inside {[0:99]};
                         da inside {[100:200]};
			}
  function void display(string prefix = "NOTE");
      $display("[%s]%t %s sa = %0d, da = %0d", prefix, $realtime, name, sa, da);
      foreach(payload[i])
        $display("[%s]%t %s payload[%0d] = %0d", prefix, $realtime, name, i, payload[i]);
  endfunction
endclass

tb.sv文件

module tb_top;
    my_trans pkt0, pkt1, pkt2;
    initial begin
        pkt0 = new();
        pkt0.sa =1;
    	pkt0.da =2;
	    pkt0.display();

        pkt1 = new ();
        pkt1.sa = $urandom();//二次随机约束覆盖前面的随机约束
	    pkt1.da = $urandom();
	    pkt1.display();

	    pkt2 = new ();
        for(int i=0; i<5; i++) begin
            assert (pkt2.randomize ());//调用了rand,randc和constraint,使用断言检查randomize ()的结果,如果随机化成功,函数返回1,随机化失败,函数返回0
	    pkt2.display();
	    end
    end

    my_trans pkt[5];//例化5个pkt,pkt0, pkt1, pkt2,pkt3, pkt4
    initial begin
        for(int i =0 ; i< $size(pkt); i++) begin
            pkt[i] = new();
	        pkt[i].sa = i;
	        pkt[i].da = i*i;
            pkt[i].display();
    	end
    end   
endmodule

执行make compmake run命令

[NOTE]                   0 Packet sa = 1, da = 2
[NOTE]                   0 Packet sa = 125, da = 226
[NOTE]                   0 Packet sa = 46, da = 187
[NOTE]                   0 Packet sa = 65, da = 140
[NOTE]                   0 Packet sa = 13, da = 159
[NOTE]                   0 Packet sa = 76, da = 196
[NOTE]                   0 Packet sa = 5, da = 172
[NOTE]                   0 Packet sa = 0, da = 0
[NOTE]                   0 Packet sa = 1, da = 1
[NOTE]                   0 Packet sa = 2, da = 4
[NOTE]                   0 Packet sa = 3, da = 9
[NOTE]                   0 Packet sa = 4, da = 16

rand与randc区别:rand相当于掷骰子,1-6的概率每次都一样,而randc必须经过一个周期随机之后才会出重复,第一轮肯定不会一样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SystemVerilogVerilog是硬件描述语言,用于设计数字电路和系统。它们有以下区别: 1. SystemVerilogVerilog更强大,支持更多的特性和语言结构,例如对象导向编程、接口、类、任务和函数等。 2. SystemVerilogVerilog更容易进行验证和仿真,它提供了更多的验证特性,例如断言、约束随机化测试等。 3. SystemVerilogVerilog更适合于复杂的设计和系统级设计,它提供了更多的抽象层次和模块化特性,例如包、命名空间和配置等。 4. SystemVerilogVerilog更容易进行重用和扩展,它提供了更多的库和标准,例如UVM(通用验证方法)和VMM(验证方法学)等。 总之,SystemVerilogVerilog的扩展和升级版本,它提供了更多的特性和优势,使得它更适合于现代的硬件设计和验证。 ### 回答2: System VerilogVerilog都是硬件描述语言,用于设计和验证数字电路和系统。然而,它们之间存在一些重要的差异。 1. 类型系统:System Verilog引入了一个强大的类型系统和面向对象编程概念,这使得代码更加模块化和易于维护。Verilog缺乏这些功能,因此更难以组织和管理大型项目。 2. 集成的验证功能:在System Verilog中,有大量的验证功能,包括断言、波形分析、交易级建模等。这些功能使得设计和验证更加紧密地集成在一起。然而,在Verilog中,需要使用其他工具来处理验证问题,这增加了复杂性并减慢了设计流程。 3. 代码重用性:System Verilog提供一些有用的和强大的代码重用功能,例如基于接口的设计、继承等。这些功能使得代码可以更加容易地重用,并且减少了错误和代码冗余。然而,Verilog缺乏这些功能,因此编写可重用的代码更加困难。 4. 高级合成功能:System Verilog为高级合成提供了功能,包括多级继承、虚函数等。这些功能可以使代码更容易优化为硬件,从而提高性能和可靠性。然而,Verilog缺乏这些功能,因此编写优化的代码更加困难。 总之,System Verilog提供了一些强大的功能,使得设计更加易于管理和验证,并且使得代码更加模块化和可重用。虽然Verilog也是一种十分重要的硬件描述语言,但是System Verilog提供了更多的灵活性和功能,并且已经成为了最流行的硬件描述语言之一。 ### 回答3: SystemVerilogVerilog都是硬件描述语言(HDL),但是它们之间存在一些关键的区别。 首先,SystemVerilogVerilog更加强大和灵活。它不仅包括了Verilog的语法和特性,还增加了一些新的特性,例如:面向对象编程(OOP)、数据类型、系统任务和函数等。这使得SystemVerilog可以更好地支持复杂的设计和验证。同时,SystemVerilog语言的建模能力也更加强大可靠,如对于数据类型和并行语言的支持。 其次,SystemVerilogVerilog更加适合于验证。SystemVerilog不仅能够编写模块级测试,而且可以编写功能、事务和覆盖率驱动的测试。同时,SystemVerilog通过集成性实现了对仿真和验证的神经网络神经网络线圈的支持,还提供了方便的时间和事件控制支持。 第三,在语法和语义方面,SystemVerilogVerilog的不同之处在于,其语义更加准确。例如,在SystemVerilog中,对于模块的实例化可以使用运算符“new”,这个不但使得代码更加可读,而且可以使用现成的类或者模块进行封装,极大的精简代码开发量。 结论:综上所述,SystemVerilogVerilog的增强版,它包含了Verilog的语法和特性,并增加了更多最新特性,同时更为方便于复杂设计的实现和测试验证的开发。在设计和验证最新的芯片或设备时,SystemVerilog已成为当前可用的最佳工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值