← 大疆FPGA逻辑岗B卷(19.08.06)

推荐答案 测试一下

用systemVerilog的contraint语句实现以下随机激励:

填空题 中等 笔试真题

参考答案

SystemVerilog 的 constraint(约束)用于在随机化过程中对随机变量施加限制条件。基本语法:在类内部使用 `constraint` 关键字定义约束块,随机变量需声明为 `rand` 或 `randc`。常见约束类型包括: 1. 范围约束:使用 `inside` 或关系运算符。例如 `addr inside {[0:255]};` 或 `addr > 100 && addr < 200;`。 2. 条件约束:使用 `if-else`、`->`(蕴含)或 `##`。例如 `if (mode == 0) addr < 128; else addr >= 128;`。 3. 关系约束:变量之间的大小、相等关系。例如 `data == addr + 1;`。 4. 分布约束:使用 `dist` 关键字指定权重。例如 `addr dist {[0:100]:=1, [101:255]:=10};` 表示后段出现概率更高。 5. 循环约束:使用 `foreach` 或 `sum()`。例如 `foreach (arr[i]) arr[i] inside {[0:15]};`。 6. 求解顺序控制:使用 `solve ... before` 改变随机变量的求解顺序。例如 `solve a before b;` 让 a 先确定。 7. 随机化禁用:使用 `rand_mode(0)` 关闭某个变量的随机化。 示例:产生一个随机字节 `data`,要求为偶数且大于 100,同时 `addr` 在 0~255 范围内且与 `data` 之和等于 300。 ```systemverilog class my_packet; rand bit [7:0] data; rand bit [7:0] addr; constraint c1 { data > 100; data % 2 == 0; } constraint c2 { addr inside {[0:255]}; data + addr == 300; } endclass initial begin my_packet p = new(); assert(p.randomize()); $display("data=%0d addr=%0d", p.data, p.addr); end ``` 注意:constraint 块内必须使用布尔表达式,不能使用过程语句如 `$display`。约束求解器在随机化时自动寻找一组满足所有约束的解。若约束矛盾(如 `data > 200` 且 `data < 100`),随机化会失败。通常使用 `assert(randomize())` 或检查 `randomize()` 返回值来捕获失败。

涉及知识点

  • systemVerilog
  • SystemVerilog
  • systemverilog
← 上一题
登录后反馈错题