【问题标题】:How to generate random number of flops in system verilog?如何在系统verilog中生成随机数的触发器?
【发布时间】:2018-03-19 14:54:21
【问题描述】:

我正在尝试在 0-10 次翻牌之间添加随机数量的翻牌。但是在随机数为0时面临一个问题。 如果随机值为 0,则预期数据不应失败。您能否建议您的 cmets。

代码:

module tx_delay_bmod_1(clk, i_tx_data,o_tx_data);
parameter CH_NUM = 4;

input clk;
input  i_tx_data;
output reg  o_tx_data;
int DELAY;
bit o_tx_data_tmp[100];

  int random_flop_cnt;
  int seed_num,ntb_random_seed;

  initial
     random_flop_cnt = (($urandom(CH_NUM )%10) + ((CH_NUM/4)*10));


always@(negedge clk) begin
if (random_flop_cnt==0) o_tx_data = i_tx_data; 
    else begin
      for(int i=0; i<random_flop_cnt; i++) begin
                if(i==0)
                o_tx_data_tmp[0] <= i_tx_data;
                else o_tx_data_tmp[i] <= o_tx_data_tmp[i-1];
                if(i==(random_flop_cnt-1))
                 o_tx_data <= o_tx_data_tmp[i];
      end 
      end
   end 

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    正如 Raz 所说:您在时钟代码中有一个寄存器(并且您使用 '=' 而不是 '

    在 always 块中根本不需要循环。知道未使用的寄存器已被删除,您可以将它们全部链接起来并选择一个输出:

    bit [99:0] o_tx_data_tmp;
    
    always@(negedge clk)
        o_tx_data_tmp <= {o_tx_data_tmp[98:0],i_tx_data}; 
    
    assign o_tx_data = random_flop_cnt==0 ? i_tx_data : o_tx_data_tmp[random_flop_cnt-1];
    

    主要优点是可读性,特别是当您正在做一些不寻常的事情(使用随机数量的寄存器)时,这可能很容易让任意读者感到困惑。

    我假设您知道这只是行为上的。

    【讨论】:

      【解决方案2】:

      flop_cnt == 0 上,您仍然会得到一个翻牌,因为您已经将它编码到一个对时钟敏感的always 块中(因此,通过这个 1 分配,它将合成一个翻牌)。您可以考虑将其替换为 generate 块内的直接 assign,即 if 0 -&gt; use assign else -&gt; use an always block(块级解决方案)。

      或者如果没有延迟就不需要实例化这个块,你可以限制flop_cnt生成大于0的数字。此外,您根本不会实例化此块,只需在顶层以不同方式路由信号(架构解决方案)。

      【讨论】:

        猜你喜欢
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        相关资源
        最近更新 更多