2013-08-28 2 views
0

나는 비교적 새로운 Verilog (VHDL 사용자)이며, 내 기술을 향상시키기 위해 Verilog를 사용하여 내 테스트 환경을 구축했다. (내 QC는 자신의 환경을 사용한다.)Verilog에서 여러 줄 매크로를 정의하는 방법은 무엇입니까?

내 env에서 나는 회선 (i2c 마스터)에 무작위로 자극을주는 마스터를 에뮬레이트합니다.

`define writeChipId(addr)\ 
sda = 1\ 
#7500 sda = addr[3];\ 
#2500 sda = addr[2];\ 
#2500 sda = addr[1];\ 
#2500 sda = addr[0];\ 
#2500; 

`define writeData(data)\ 
sda = data[7]\ 
#2500 sda = data[6];\ 
#2500 sda = data[5];\ 
#2500 sda = data[4];\ 
#2500 sda = data[3];\ 
#2500 sda = data[2];\ 
#2500 sda = data[1];\ 
#2500 sda = data[0];\ 
#2500 sda = 1;\ 
#2500; // time for the slave to answer 

`define readData\ 
#sda = 1\ 
#20000 sda = 0;\ 
#2500; // master always answer ACK 

내 문제가 있다는 것입니다 : 난 정말 진정한 마스터를 사용하려는 경우에만 '바르게 행동'마스터 싶어하지 않았기 때문에

, 나는 I2C 통신에 저를 제공하기 위해 다음과 같은 매크로를 만들어 , 내가 이러한 매크로를 사용하려고하면 내가 컴파일 오류 (modelsim을 사용하여) 내가 구문 오류가 있고 나는 '예기치 않은'[ '' '이어야합니다. chipID 매크로를 사용하고 예기치 않은 '#'은 ';'이어야합니다. 읽기 \ 쓰기 매크로를 사용할 때.

내가 시도 (실패)

`writeChipId(`chipID) 

`writeData(rndData) 

`readData 

아니지만 적어도 마지막으로있는 용도 : 내가없이 같은 라인을 작성하는 경우 내 코드의 매크로, 그것은 완벽하게 컴파일됩니다 (단 한 곳에서만 시도 했으므로 다른 곳에서는 12 곳을 원하지 않습니다. 매크로 ...)

누구는 단서가 무엇입니까? 나는 행운이 함께 매크로와 함께 놀려고 노력하고 또한 그들이 중간에 갇혀 공백이 없다는 것을 확인했습니다.
또한 여러 줄로 된 매크로 예제를 찾아 보았지만 비슷한 결과를 얻지 못했습니다. 모든 repliers

편집에 사전에

감사
뭔가 내가 말을 잊어 버렸 : 내가 매크로를 가지고 입력을 제거하고 CONST 값 대신 입력을 사용할 때, 그것은 잘 작동합니다.

+1

왜 '작업'대신 인수를 사용하여 멀티 라인 매크로를 사용하기로 결정 했습니까? – Greg

+0

내가 말했듯이 나는 Verilog을 처음 사용한다. 나는 '과제'에 대해 잘 알지 못하고 있으며 이것은 내 TB의 진화이다. (수동으로 행동을하거나 매크로로 옮겨 가기 시작했다.)매크로없이 마스터와 명령 CPU 동작을 에뮬레이션 할 수 있을지 확신 할 수 없습니다. 나는 틀릴 수도 있지만 이것은 내가 지금까지 언어에 대해 알고있는 전부다. ... – user2141046

답변

0

ok 해결책을 찾았습니다 : 각 매크로의 첫 번째 줄에도 세미콜론 (;)이 있어야합니다 - 또한 chipID에 대한 매개 변수 사용은 verilog에서 어렵습니다. 이것은 입력을 reg에 넣음으로써 해결되었습니다. reg의 비트를 사용하여.

내가이 문제에 걸쳐 나는 때문에 내가 만든 또 다른 실수의 매크로를 사용하는 이전의 시간을 오지 않았다 - 내가 상수의 매크로 (`define ADD 32'h0;을 의미) 세미콜론 것으로 정의하고 내가 그것을 사용하는 경우는 삽입; 선에 그리고 OK처럼 보였다.

2

`define의 구문에는 매크로 식별자/인수 뒤에 공백이 필요합니다. 그렉 지적

`define writeChipId(addr) \ 
sda = 1;\ 
#7500 sda = addr[3];\ 
#2500 sda = addr[2];\ 
#2500 sda = addr[1];\ 
#2500 sda = addr[0];\ 
#2500; 

이 정말 task 사용에 대한 호출합니다.

task writeChipId(input [3:0] addr); 
sda = 1; 
#7500 sda = addr[3]; 
#2500 sda = addr[2]; 
#2500 sda = addr[1]; 
#2500 sda = addr[0]; 
#2500; 
endtask 
+0

'task'가 어떻게 사용되는지 배우는 것이 필요 하겠지만, 이제는 그것이 존재한다는 것을 알기 때문에 너무 어렵지 않아야한다.) 감사. – user2141046

+0

ok, Greg and Adam - 작업을 조사한 후 내가 한 일은 실제로 차이점을 알 수 없습니다. 내가 사용하는 다중 라인 정의에서'task'가 왜 바람직한가? '이점'은 어떤 장점을 가지고 있습니까? – user2141046

관련 문제