我试图在0-10个触发器之间添加随机数量的触发器。但是当随机数为0时面临问题。 如果随机值为0,期望数据不应该被翻转。你能否提出你的意见。
代码:
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
答案 0 :(得分:0)
在flop_cnt == 0
上,你仍会得到一个翻牌,因为你已经将其编码成对时钟敏感的always
块(因此,通过这个1分配,它将合成到翻牌中)。您可以考虑在assign
块中使用直接generate
替换它,即if 0 -> use assign else -> use an always block
(块级解决方案)。
如果没有延迟,如果没有必要实例化此块,您可以限制flop_cnt
代产生大于0
的数字。此外,您根本不会实例化此块,只是以不同方式路由顶层信号(架构解决方案)。
答案 1 :(得分:0)
正如Raz所说:你在时钟代码中有一个寄存器(你使用&#39; =&#39;而不是&#39;&lt; =&#39;对于那个。)你定义100比特和链只是你需要的。这意味着其余部分未使用并且已经过优化。
根本不需要在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];
主要优点是可读性,特别是当您做一些与众不同的事情(使用随机数量的寄存器)时,这可能会轻易混淆任意读者。
我假设你知道这只是行为。