在一些微控制器的外设上,我们有写敏感和读敏感寄存器。例如串口有一个
TX
寄存器,对它们的写操作会触发一些动作。我想在 FPGA 上实现相同的行为。
我用输入reg
serial
制作了一个模块TX
(输入真的可以是reg
吗?),每次更改后都会强制其处于未定义状态,但我犯了一些错误。这是我的代码:
module serial #(
parameter DATA_WIDTH = 8
)
(
input clk,
input reg [DATA_WIDTH-1:0] TX
);
reg fifo_write_req = 0;
always @(TX) begin
if (TX != {DATA_WIDTH{'x}})
begin
fifo_write_req <= 1;
end
end
always @(negedge clk) begin
fifo_write_req <= 0;
TX <= {DATA_WIDTH{'x}}; // Illegal reference to net "TX".
end
我怎样才能达到期望的行为?
一个问题是您正在尝试分配作为输入的变量 TX。
这会在编译时产生错误,因此没有任何行为;它不能在 EDA Playground 上的任何商业模拟器上编译。
改变
input reg [DATA_WIDTH-1:0] TX
到
output reg [DATA_WIDTH-1:0] TX
消除编译错误。
如果您不需要输出,也可以将其设为局部变量。
还有
对于综合工作流程,我不会以这种方式分配和检测 x。
在综合工作流程和模拟工作流程中分配和检测 x 的行为方式不同。 在 FPGA 综合工作流程中,分配和检测 x 很少有意义。 当尝试强制进行额外优化或类似的操作时,可能会在嵌套的
if
或 case
语句中。