You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog中1023位随机向量生成:测试台实现方案问询

嘿,这个需求我在做FPGA/ASIC测试台的时候经常碰到,给你分享几个实用的实现方案,分纯Verilog和SystemVerilog两种场景,毕竟有些老项目可能还在纯Verilog环境下跑:

方案1:纯Verilog环境下的实现(兼容IEEE 1364-2001及以上)

纯Verilog没有SystemVerilog那种一键随机化的语法,不过我们可以用内置的$urandom(无符号随机函数)分块生成,再拼接成1023位的向量。$urandom每次返回32位无符号数,我们循环生成多块再组合就行,代码示例如下:

module tb_dut;
  reg [1022:0] random_vec; // 1023位向量,下标从0到1022
  wire [1022:0] dut_input;

  // 例化你的被测设计
  dut u_dut (
    .input_vec(dut_input)
  );

  assign dut_input = random_vec;

  initial begin
    // 可选:设置固定随机种子,方便调试复现
    $srandom($time); // 用当前时间做种子,每次运行序列不同;也可以写固定值比如12345

    repeat(10) begin // 循环生成10组不同的随机向量,可按需调整次数
      integer idx;
      random_vec = '0; // 先初始化向量为全0

      // 生成前31个32位块,共31*32=992位
      for (idx = 0; idx < 31; idx++) begin
        random_vec[idx*32 +: 32] = $urandom; // 用+:操作符选择连续的32位区间
      end
      // 处理最后剩下的31位(1023-992=31)
      random_vec[992 +: 31] = $urandom & 31'h7FFFFFFF; // 取$urandom的低31位

      #10; // 等待一段时间让DUT完成处理,时间可按需调整
    end

    $finish; // 结束仿真
  end
endmodule

这里用$urandom而不是$random是因为$random返回有符号数,可能会出现高位全1的情况,无符号的$urandom更适合生成全范围的随机向量。

方案2:SystemVerilog环境下的实现(更简洁高效)

如果你的仿真环境支持SystemVerilog,那直接用randomize()方法就太方便了,不需要手动分块,一键就能生成任意位宽的随机向量,还能加约束条件,代码示例:

module tb_dut;
  logic [1022:0] random_vec;
  logic [1022:0] dut_input;

  // 例化被测设计
  dut u_dut (
    .input_vec(dut_input)
  );

  assign dut_input = random_vec;

  initial begin
    repeat(10) begin
      // 直接随机化整个1023位向量
      if (!random_vec.randomize()) begin
        $error("随机化失败!请检查向量定义或仿真环境");
      end

      // 可选:打印部分向量内容验证
      $display("生成的随机向量(高32位):%h", random_vec[1022:991]);
      #10;
    end
    $finish;
  end
endmodule

要是你需要对随机向量加约束(比如固定某几位的值、限制某些位的范围),直接加约束块就行,比如:

constraint c_input {
  random_vec[0] == 1'b1; // 固定第0位为1
  random_vec[1022] inside {1'b0, 1'b1}; // 最高位只能是0或1(其实默认就是,这里只是示例)
}

把这个约束块放在random_vec的定义里,或者用randomize() with { ... }的形式临时加约束,非常灵活。

额外小技巧:复现随机序列

调试的时候如果需要复现同一个随机序列,记得设置固定的随机种子:

  • 纯Verilog里:在initial开头加$srandom(12345);(12345是你自定义的种子值)
  • SystemVerilog里:在initial开头加random_vec.srandom(12345);,这样每次运行生成的随机向量序列完全一致,方便定位问题。

内容的提问来源于stack exchange,提问作者Sushrut Kaul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:31:32