axi channel valid control
原来我是用下面这种方式控制axi channel里的valid,比如ar_valid。
但当结束信号ext_biu_ar_ready和开始信号arb_rd_val_q一起high起来的时候会有问题,后面还需要补偿下 | arb_rd_val_q |
这个scenario 2我也不记得当时什么场景了, 好像不太对,先这么放着了。
// scenario 0
//
// arb_rd_val_q : _-_____
// ext_biu_ar_ready : _____-_
//
// ar_valid_in : _----__
// ar_valid_q : __----_
// biu_ext_ar_valid : _-----_
// scenario 1
//
// arb_rd_val_q : _-_____
// ext_biu_ar_ready : _-_____
//
// ar_valid_in : _______
// ar_valid_q : _______
// biu_ext_ar_valid : _-_____
// scenario 2
//
// arb_rd_val_q : -______
// ext_biu_ar_ready : -______
//
// ar_valid_in : _______
// ar_valid_q : -______
// biu_ext_ar_valid : -______
wire ar_valid_in;
wire ar_valid_q;
assign ar_valid_in = (ar_valid_q | arb_rd_val_q) & (~ext_biu_ar_ready);
assign biu_ext_ar_valid = ar_valid_q | arb_rd_val_q;
dffrl_s #(1) ar_valid_reg (
.din (ar_valid_in),
.clk (clk),
.rst_l (resetn),
.q (ar_valid_q),
.se(), .si(), .so());
后来发现这样写更好些,wire biu_ext_ar_valid_in = (biu_ext_ar_valid & ~ext_biu_ar_ready) | arb_rd_val;
道理是一样的,但开始和结束信号一起到的时候也没问题。以后这种控制信号,都改成下面这样写了。
当看到这种不谋而和的时候,还是很开心的。即便原来是always的风格,遇到这种valid控制信号的情况,也改成dff实例加这种写法了.
// scenario 0
//
// arb_rd_val : _-_____
// ext_biu_ar_ready : _____-_
//
// biu_ext_ar_valid_in : _----__
// biu_ext_ar_valid_q : __----_
// scenario 1
//
// arb_rd_val : _-_____
// ext_biu_ar_ready : _-_____
//
// biu_ext_ar_valid_in : _-_____
// biu_ext_ar_valid_q : __-____
wire biu_ext_ar_valid_in = (biu_ext_ar_valid_q & ~ext_biu_ar_ready) | arb_rd_val;
dffrl_s #(1) ar_valid_reg (
.din (biu_ext_ar_valid_in),
.clk (clk),
.rst_l (resetn),
.q (biu_ext_ar_valid_q),
.se(), .si(), .so());
assign biu_ext_ar_valid = biu_ext_ar_valid_q;