0

我对verilog(VHDL用户)比较陌生,为了提高我的技能,我使用verilog构建了我的测试环境(我的QC使用他们自己的环境)。

在我的环境中,我模拟了一个在线路上强制随机刺激的主控(i2c 主控)。

因为我真的不想使用真正的主人,只想要一个“表现良好”的主人,我创建了以下宏来为我提供 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

我的问题是,当我尝试使用这些宏时,我得到一个编译错误(使用modelsim),说我有一个语法错误并且我有意外的'['应该是';' 用于使用chipID宏并且意外的'#'应该是';' 使用读\写宏时。

我尝试(但失败)的用法是

`writeChipId(`chipID)  

`writeData(rndData)   

 `readData

最后但并非最不重要的一点是:如果我在代码中编写没有宏的相同行,它可以完美编译(只在一个地方尝试过,不想在其他 12 个地方这样做,我需要这些宏...... )

有人知道问题是什么吗?我一直在尝试使用没有运气的宏,并且还验证了它们中间没有空格。
还寻找了多行宏示例,发现与我所做的类似的事情没有给出答案。

提前感谢所有回复者

编辑
我忘记说的内容:当我使用宏并删除输入并使用 const 值而不是输入时,它工作正常。

4

2 回答 2

3

a 的语法`define在宏标识符/参数之后需要一个空格。

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

正如 Greg 指出的那样,这确实需要使用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
于 2013-08-29T14:04:31.463 回答
0

好的,找到了解决方案:每个宏的第一行也应该有分号(;),而且 - 在verilog上很难使用chipID参数,这是通过将输入放入reg并使用reg的位来解决的。

我上次使用宏时没有遇到这个问题,因为我犯了另一个错误 - 我将常量的宏定义为有分号(意思`define ADD 32'h0;),当我使用它时,它插入了 ; 到线,似乎还可以。

于 2013-08-28T10:20:54.080 回答