앞선 글에서 베릴로그의 기초적인 토큰들을 구분해 보았고,

이제 토큰들 중에서 베릴로그에서 수표현을 정리해 보겠다.

 

개인적으로 처음 베릴로그를 보았을때 조금 거부감이 느껴졌던 부분이기도 한데,

다른 프로그래밍 언어들과 달리 상수들의 표현이 strict하게 표현되어 불편한 느낌을 받았다.

(물론 HW를 설계하는 언어니까 모든걸 strict하게 표현하는게 좋지만 귀찮은걸요...)

 

먼저 간략하게 기본적인 형태를 정리 해 보면 아래와 같은 형식으로 상수를 나타낼 수 있다.

 

상수 = [비트 크기] [진법표현] [수표현];

예를 들면

4 비트 크기의 15를  2진수를 signed 로 표시하고 싶다면

4 'sb 1111 와 같이 표현이 가능한 것이다

자세한 사항들은 아래에서 표로 정리하였다.

 

먼저 표준에서 BNF로 기술한 수체계는 아래와 같다

BNF를 모른다면 요 글이나 다른 글들을 찾아보길 바란다

(표준에서 어떤 convention을 따르는지도 보기 위해 읽고 오는게 좋다)

어우 길어


 

설명을 위해 그림과 반대로 Bottom-Up 형태로 정리하겠다

처음 만난다면 인내심을 갖고 천천히 읽어보자


BNF ( ! 기호는 공백을 포함할 수 없다는 의미) 설명 및 예시
z_digit ::= z | Z | ? z_digit은 z혹은 Z 또는 ? 로 표현할 수 있다

회로 내에서 High - Z의 의미를 생각해보면
?문자를 상수로써 사용하게 만든게 합리적이다.
x_digit ::= x | X Unknown을 의미하는 x_digit은 x혹은 X로 표현할 수 있다.
hex_digit ::=
x_digit | z_digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
| a | b | c | d | e | f | A | B | C | D | E | F
16진수를 구성하는 digit는 16진수를 구성하는 숫자들과

16진수를 표현할 대/소 문자 알파벳 character,

그리고 z_digit, x_digit을 포함할 수 있다.

(16진수를 구성하는 하나의 digit을 정의한 것이지
16진수 표현 자체를 의미하는것이 아니다)
non_zero_decimal_digit ::=
 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

decimal_digit ::= 
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

binary_digit ::= 
x_digit | z_digit | 0 | 1

octal_digit ::=
 x_digit | z_digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
위와 같은 방식으로
각 진수에서 표현할 digit들을왼쪽과 같이 정의 하였다.

진수를 구성하는 하나의 digit을 정의한 것이지
수 표현 자체를 의미하는것이 아님에 주의하자
decimal_base! ::= '[s|S]d | '[s|S]D

binary_base! ::= '[s|S]b | '[s|S]B

octal_base!::= '[s|S]o | '[s|S]O

hex_base! ::= '[s|S]h | '[s|S]H
진수를 표현하기위한 base를 왼쪽과 같이 정의,
기본적인 형태는  '(apostrophe)와
진수를 나타내는 문자가 결합되었으며
선택적으로 사이에 s/S가 포함 될 수 있다.


이때 s/S는 부호를 의미하는데,
s/S가 존재한다면 해당 base가 나타내는 수를
signed로 본다는 것을 의미한다.
없으면 unsigned로 본

이때 각 문자들 사이에는 공백이 포함 될 수 없다

이때 10진수를 예시를 들어 설명하면 아래와 같다.

'sd  :라는 base는 
뒤에 올 수를 signed로 본다는 것을 의미한다.
따라서 4'sd15 = 1111 이며,

이 수를 읽을 때는 2의 보수의 형태로
4'sd15 = -4'd1 으로 볼 수 있다

[s/S]는 비트패턴에 영향이 없다
non_zero_unsigned_number! ::=
non_zero_decimal_digit { _ | decimal_digit}

unsigned_number! ::=
decimal_digit { _ | decimal_digit }

binary_value! ::=
binary_digit { _ | binary_digit }

octal_value! ::=
octal_digit { _ | octal_digit }

hex_value! ::=
hex_digit { _ | hex_digit }
수를 표현하는 부분으로
각각 표현할 진법에 따라 _문자를 이용해
글자들을 나눌 수 있다


이때_문자의 존재에 따라 값과
의미가 달라지지 않는다

따라서 문서화와 같은 가독성 측면에서 사용이 가능하다.

16진수로 예를 들어보면
상수 표현의 수 부분은 
ffff == ff_ff == f_f_f_f 이모두 같은 수를 나타낸다
size ::= non_zero_unsigned_number
sign ::= + | -
크기를 나타내는 부분에
non_zero_unsigned_number가 들어가는데,
위에서 설명한 바와 같이
_문자를 통해 수를 표현할 수 있다.
decimal_number ::=
unsigned_number
| [ size ] decimal_base unsigned_number
| [ size ] decimal_base x_digit { _ }
| [ size ] decimal_base z_digit { _ }

binary_number ::=
[ size ] binary_base binary_value

octal_number ::=
[ size ] octal_base octal_value

hex_number ::=
[ size ] hex_base hex_value
10진법을 제외한 나머지 진법 표현은
선택적으로 크기를 지정해 준뒤
각 진법에 맞는 base와 value를 통해 수를 표현


하지만 10진법의 경우에는 base가 생략이 가능하며,
나머지 진법과의 구분적인 특징은 특정 비트만 x, z로 지정이 불가능 하다는 특징이 존재한다.

예를 들면, 2진수의 경우
1_1     'sb     1_1_1와 같은 표현이 가능하며
이는 11비트의 signed 111(2진수) 를
나타내는 형태이다

(아래에 사진을 첨부함)
real_number! ::=
unsigned_number . unsigned_number
| unsigned_number [ . unsigned_number ] exp [ sign ] unsigned_number

exp ::= e | E
실수 표현으로는 소수점과 지수표현을
이용해 나타낼 수 있다

예를 들면 아래와 같다
3.3 (실수 상수)
3.3e-3 (실수 표현)

이때 주의해야 할 표현으로는
소수점이나 지수를 표현할때
공백문자를 포함해서는 안된다는 것이다

3. 3과 같은 형태는 허용하지 않는다
number ::= 
decimal_number
| octal_number
| binary_number
| hex_number
| real_number
이제 모든 수를 쓸 수 있다 !

괴랄한 수표현과 출력결과

ref: "IEEE Standard for Verilog Hardware Description Language," in IEEE Std 1364-2005 (Revision of IEEE Std 1364-2001) , vol., no., pp.1-590, 7 April 2006, doi: 10.1109/IEEESTD.2006.99495.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기