我对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 值而不是输入时,它工作正常。