verilog的逻辑判断

  verilog是可读性相当差的一门语言,其实这个不是语言的原因,而是天生的工种的原因。描述数字逻辑嘛,东西一多就显的乱得很,变量信号的耦合很严重,找一个信号的驱动源经常是需要跳转查找好几个文件。因此,提高verilog代码的可读性很有必要。
  我在这个方面的思路就是尽量借鉴C语言的写法。begin-end就是大括号{},always下面必定要一个,每个if-else还有case的selector都带着。还有就是宏定义的运用,像是简单的1位的1和0都定义成了:
View Code
1 `define ON 1'b1
2 `define OFF 1'b0
3 `define HIGH 1'b1
4 `define LOW 1'b0
然后1位的信号的操作都用上,像是赋值会写成类似data_flag<=`ON,逻辑判断会成类似sys_reset_n==`LOW。
  一般的示例中描述一个高电平使能触发器的代码:
View Code
1 always @(posedge clk)
2     if(en)     data_reg<=data_in;
我会写成:
View Code
1     always @(posedge clk)
2     begin
3         if(en==`HIGH)
4         begin
5             data_reg<=data_in;         
6         end
7     end                  
我感觉这样可读性会比较好,但我之前一直担心这两者会编译出不同的东西。begin-end有没有是完全没关系的,主要就是两个if语句if(en)跟if(en==`HIGH)的区别。因为前者很明显是可以直接作为触发器的使能端输入,而后者是有一个显式的比较操作,不知道会不会在使能端之前多出逻辑判断的一个比较电路模块,这样会显得得不偿失。然后我就分别用下面的代码编译了一下,
View Code
1 always @(posedge clk)               always @(posedge clk)
2      begin                                            begin
3      if(en)                                              if(en==`HIGH)
4        begin                                             begin
5           data_reg<=data_in;                    data_reg<=data_in;    
6        end                                                end
7      end                                               end
 结果出来的东西都是一样的,用RTL viewer看都是:


这下我就放心了,然后我还用if(!en)和if(en==`LOW)编译了一下,结果出来的东西也是一样的,是一个低电平使能的触发器:


  看来完全是可以用if(en==`LOW)取代if(!en)的。
posted @ 2013-04-12 21:52  自动控制原理  阅读(2905)  评论(0编辑  收藏  举报