我一直在用Verilog编写一个16位RISC微处理器,我又遇到了另一个障碍。代码编写任务结束后,我尝试合成它。发现了几个意外错误,我修复了它们。繁荣,巨大的错误。
该设计包括四个16位公共总线。出于某种原因,我从综合工具中获得了这些总线的多个驱动程序错误。
计算机的体系结构受到Bill Buzzbee的Magic-1的启发,几乎完全相同,不包括Page Table机制。这是Bill的原理图PDF:Click Here。向下滚动到第7页的架构。
控制矩阵负责处理总线和驱动时,我绝对相信在任何给定的实例中每个总线只有一个驱动程序。我想知道这是否可能是问题,因为综合工具可能不知道这一点。
三态语句允许写入总线,例如:
assign io [width-1:0] = (re)?rd_out [width-1:0]:0; // Assign IO Port the value of memory at address add if re is true.
编辑:我忘了提到,io端口是双向的(inout),只是连接到总线。这段代码来自RAM,单端口。除RAM之外的所有其他寄存器都有单独的输入和输出端口。
控制矩阵每个负边缘更新一个30位状态,例如:
state [29:0] <= 30'b100000000010000000000000100000; // Initiate RAM Read, Read ALU, Write PC, Update Instruction Register (ins_reg).
控制矩阵相当小,因为在我花时间编写其余部分之前,我只编写了一条指令来测试设计。
不幸的是,将整个代码复制粘贴到这里是不合逻辑的。
我一直在思考这几天,并指出我正确的方向将非常感激。
答案 0 :(得分:2)
当re
为低时,assign语句应该是浮动的(驱动Zs)。
// enable ? driving : floating
assign io [width-1:0] = (re) ? rd_out [width-1:0] : {width{1'bz}};
如果它正在驱动任何其他值,那么合成器将视为多路复用器而不是三态。这是冲突的驱动程序消息来自的地方。