2017-03-16 74 views
0

我是Verilog的新手,我陷入了一个问题。我不是我做错了什么。我有两个模块(A和B)。模块B进行一些处理并将值存入模块B输出的寄存器'数据'中,并作为模块A的输入。模块A比较数据中的值并发送一个信号以重置模块B中的寄存器'数据'。数据在模块B处理存在并且是正确而它不是在模块A出现未将数据复制到寄存器

ModuleB (address,indata,Data,reset,clk,ResetSignal,Out) 
input [15:0] address; 
input [15:0] indata; 
input  ResetSignal; 
output [5:0] Data; 
output [15:0] Data; 

reg[15:0] DataReceived; 
reg[0:5] Data = 6'b000000; 
reg[15:0] Out; 

if(address == 16'h01a0) 
begin 
    DataReceived<= indata; 
    Data = (Data| 6'b000001); // all 6 values will be copied on basis of some address 
end 
. 
. 
. 

ModuleA (...) 

reg[15:0] address; 
reg[15:0] indata; 
reg[15:0] Out; 
reg ResetSignal; 
reg[5:0] Data; //it is an internal register of module B which contains data received from module B 

wire reset,clk; 

ModuleB (.address(address),.indata(indata),.Data(Data),.clk(clk),.reset(reset),.ResetSignal(ResetSignal),.Out(Out)); 

always @ (posedge clk or posedge reset) 
begin 
if (reset) 
    ResetSignal = 1'b0; 
else if (Data == 6'b111111) 
    begin 
    //set some signals 
    ResetSignal = 1'b1; // send signal back to reset the buffer Data 
    end 
end 

我已经声明的数据作为REG因此从模块B的值应该被映射。他们不应该吗?

回答

2

您在ModuleA定义reg[5:0] Data寄存器,并连接到模块ModuleB的输出:

ModuleB moduleBInstance(.address(address),.indata(indata),.Data(Data),.clk(clk),.reset(reset),.ResetSignal(ResetSignal),.Out(Out)); 

(我在这里增加了一个实例名称,我想这里有个实例名称,但你忘了它写在这里,否则模拟不会接受它。)

一些Verilog的合成不会接受reg类型的网连接到模块的输出,因为你不能分配到一个reg异步。如果将ModuleA中的网络Data的类型更改为连线(wire[5:0] Data)。你应该可以分配给它。

+0

是的,这是问题!我改变了reg在moduleA中的连线,它现在正在工作。谢谢。我有实例名称,我已经复制了一段有问题的代码,所以错过了:) – Eshaal

1

你已经离开了你的代码的部分,否则我会模仿它,但这里是我发现开始有:

在模块B你有两个输出寄存器呼叫数据。输入和输出需要具有唯一的名称。

它在模块A中看起来像是将数据定义为reg [5:0]。你需要声明一个线[5:0]。模块B有寄存器,所以模块A只是一根电线。

从此开始,然后将您的完整代码和测试平台一起发布(如果有的话)。

+0

将reg更改为wire工作!我刚刚发布了导致问题的部分代码。 – Eshaal