企业级verilog代码怪谈
(里面的话来自于蜂鸟cpu设计那本书,本人不知道是否属实,仅供一乐)
欢迎来到企业级verilog代码的世界,在编写你的代码时,请务必遵循以下规则:
- 如果有寄存器,请不要使用always块,如果有DFT模块,请实例化它。
gnrl_dfflr #(1) flg_dfflrs(flg_ena, flg_nxt, flg_r, clk, rst_n);
- 如果遇见
if (sel1)
out = in1[3:0];
else if (sel2)
out = in2[3:0];
else if (sel3)
out = in3[3:0];
else
out = 4'b0;
不要害怕,请改成:
assign out = ({4{sel1}} & in1[3:0])
| ({4{sel2}} & in2[3:0])
| ({4{sel3}} & in3[3:0])
请记住,if-else和case并不能传播不定态,编译器只会产生选择电路,而不是并行选择电路。
- 不要轻易在数据通路上使用带有reset的寄存器,它的寄存器面积与时序会比较落后,如果你必须使用,请在控制通路上。
- 请务必牢记,Clock和Reset信号应该被禁止用于除了连接DFF其他的逻辑。