数据未复制到寄存器
Data not copied to register
我是 Verilog 新手,遇到了一个问题。我不知道我做错了什么。我有两个模块(A 和 B)。模块 B 进行一些处理并将值放入寄存器 'Data' 中,该寄存器是模块 B 的输出并作为模块 A 的输入。模块 A 比较 Data 中的值并发送信号以重置寄存器 'Data' in模块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 中的值。他们不应该吗?
您遗漏了部分代码,否则我会模拟它,但这是我注意到的开头:
在模块 B 中,您有两个输出寄存器调用 Data。输入和输出需要有唯一的名称。
看起来您在模块 A 中将 Data 定义为 reg[5:0]。您需要将其声明为电线 [5:0]。 B模块有寄存器,A模块就是一根线
从那个开始,然后post你的完整代码和一个测试平台,如果你有的话。
您将 reg[5:0] Data
定义为 ModuleA
中的一个寄存器,并连接到您模块的输出 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
)。您应该可以分配给它。
我是 Verilog 新手,遇到了一个问题。我不知道我做错了什么。我有两个模块(A 和 B)。模块 B 进行一些处理并将值放入寄存器 'Data' 中,该寄存器是模块 B 的输出并作为模块 A 的输入。模块 A 比较 Data 中的值并发送信号以重置寄存器 'Data' in模块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 中的值。他们不应该吗?
您遗漏了部分代码,否则我会模拟它,但这是我注意到的开头:
在模块 B 中,您有两个输出寄存器调用 Data。输入和输出需要有唯一的名称。
看起来您在模块 A 中将 Data 定义为 reg[5:0]。您需要将其声明为电线 [5:0]。 B模块有寄存器,A模块就是一根线
从那个开始,然后post你的完整代码和一个测试平台,如果你有的话。
您将 reg[5:0] Data
定义为 ModuleA
中的一个寄存器,并连接到您模块的输出 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
)。您应该可以分配给它。