ASIC SoC2010.10.30 20:39
간만에 다시 하는 코딩을 위해서
이번에는 Emacs에서 Verilog 를 사용하고 해보기로 했습니다.
- 작년에는 거의 Verilog Template language + Perl Stript Compiler만을 사용해서 이넘을 사용해 보고 싶었지만, 사용해볼 기회가 별로 없었기 때문입니다.


Emacs에서 Verilog Mode를 사용하는 것은
VHDL Mode보다는 조금 불편한데요.. 특히 Template기능이 VHDL에 비해서 약해서 그렇습니다.

VHDL은 거의 Editer + Template수준으로 만들어 내었는데 Verilog는 Syntax Highlite 기능으로만
버텨왔기 때문입니다.

요새는 많이 좋아져서 어느정도 자동화 기능을 백그라운드로 돌리면서 에디팅을 할 수 있도록 지원해주고 있습니다.

그런 기능을 활용하기 위해서는 verilog mode를 설치해야 합니다.

http://www.verilog.com/emacs_install.html

위 사이트에 가면 알수 있습니다.
최신 Linux에서는 verilog mode를 디폴트로 가지고 오는데 MAC은 없는 관계로 위의 사이트의 내용을 참조로 해서 수정해야 운용이 가능합니다.

루트 폴더에서 .emacs 파일을 만들어서
다음과 같은 내용을 넣어 둡니다.

------------- BEGIN ----
(defun prepend-path ( my-path )
(setq load-path (cons (expand-file-name my-path) load-path)))

(defun append-path ( my-path )
(setq load-path (append load-path (list (expand-file-name my-path)))))
;; Look first in the directory ~/elisp for elisp files                                                                        
(prepend-path "~/elisp")

;; Load verilog mode only when needed                                                                                        
(autoload 'verilog-mode "verilog-mode" "Verilog mode" t )

;; Any files that end in .v, .dv or .sv should be in verilog mode                                                            
(add-to-list 'auto-mode-alist '("\\.[ds]?v\\'" . verilog-mode))

;; Any files in verilog mode should have their keywords colorized                                                            
(add-hook 'verilog-mode-hook '(lambda () (font-lock-mode 1)))

;;; User customization for Verilog mode                                                                                      
 (setq verilog-indent-level             3
       verilog-indent-level-module      3
       verilog-indent-level-declaration 3
       verilog-indent-level-behavioral  3
       verilog-indent-level-directive   1
       verilog-case-indent              2
       verilog-auto-newline             t
       verilog-auto-indent-on-newline   t
       verilog-tab-always-indent        t
       verilog-auto-endcomments         t
       verilog-minimum-comment-distance 40
       verilog-indent-begin-after-if    t
       verilog-auto-lineup              'declarations
       verilog-highlight-p1800-keywords nil
       verilog-linter                   "my_lint_shell_command"
       )
---------------- END ------------
Verilog-linter는 아직 LINT해주는 툴을 OSX에서 최근에 발견했지만, 아직 테스트 하지 못해서 그냥 냅두었습니다.

사용법은 생각보다 쉽습니다.

중요한 요소에다가 Comment 처리된
/*AUTOXXXX*/
를 넣어두고

코딩이 끝나면

Control-C Control-Z

를 하면 됩니다.

예는 아래와 같습니다.
사용자 삽입 이미지












위와 같이 중요 포인트에 /*AUTOXXX*/ 를 넣고
Ctrl-C Ctrl-Z
를 넣으면

아래와 같이 변합니다.

사용자 삽입 이미지




























위에서
always @ (/*AUTOSENSE*/)
를 하여지만 약어로
always @ (/*AS*/)

하여도 됩니다.

위에서 안보이는 것으로는 /*AUTORESET*/ 기능입니다.

   always @ (posedge clk)
   if ( reset ) begin
       /*AUTORESET*/
   end
   else begin
      a <= b;
   end

위의 코드를 가지고 Ctrl-C Ctrl-Z를 하면

   always @ (posedge clk)
   if ( reset ) begin
       /*AUTORESET*/
       // Beginning of autoreset for uninitialized flops                                                                      
       a <= 1'h0;
       // End of automatics                                                                                                  
   end
   else begin
      a <= b;
   end

으로 뒤져서 초기화가 안되는 변수에 대해서 리셋 구문을 자동으로 해줍니다.

그외에


AUTOASCIIENUM

AUTOINOUTMODULE

AUTOTIEOFF

AUTOUNUSED

AUTOINSERTLISP

AUTO_TEMPLATE

AUTOINSTPARAM


과 같은 AUTOx가 있습니다.


이중에서 AUTOASCIIENUM이 좋은넘인데요

Verilog는 VHDL과 틀려서 변수를 Char로 표시하는 것이 만만찮습니다.

ENUM String을 지원하지 않아서 생긴 문제입니다.

이것때문에 디버깅시에 머리속에서 상수값을 다시 ASCII로 변환하면서 일일이 디버깅해야 하는데

요런 문제를 해결하기 위해서 나온 AUTOx가 AUTOASCIIENUM 입니다.


//== State enumeration
parameter [2:0] // synopsys enum state_info
SM_IDLE = 3'b000,
SM_SEND = 3'b001,
SM_WAIT1 = 3'b010;

//== State variables
reg [2:0] /* synopsys enum state_info */
state_r; /* synopsys state_vector state_r */
reg [2:0] /* synopsys enum state_info */
state_e1;

//== ASCII state decoding
/*AUTOASCIIENUM("state_r", "_stateascii_r", "sm_")*/

위의 코드를 AUTOx로 변환시키면


//== ASCII state decoding
/*AUTOASCIIENUM("state_r", "_stateascii_r", "sm_")*/
// Beginning of automatic ASCII enum decoding
reg [39:0] _stateascii_r; // Decode of state_r
always @(state_r) begin
casex ({state_r}) // synopsys full_case parallel_case
SM_IDLE: _stateascii_r = "idle ";
SM_SEND: _stateascii_r = "send ";
SM_WAIT1: _stateascii_r = "wait1";
default: _stateascii_r = "%Erro";
endcase
end
// End of automatics


위와 같이 됩니다. 따라서 state_r이라는 값을 모니터링하면 현재 상테를 추적해 갈 수 있습니다.


--------------------------------


요새 거의 뜸했던

간만에 하는 ASIC 관련 포스팅이었습니다.


Posted by GUNDAM_IM