Verilog 由于参数的原因,FF/Latch的常量值为0

Verilog 由于参数的原因,FF/Latch的常量值为0,verilog,xilinx,Verilog,Xilinx,我正在构建一个UART RX,我想让它的合成时间可配置,无论是否接收到奇偶校验位: module uart_rx # ( parameter EXPECT_PARITY_BIT = 0, parameter CLK_PER_BAUD = 434, parameter CLK_PER_BAUD_WIDTH = 9 ) ( input clk, input rst, input uart_rx, output reg data_ready,

我正在构建一个UART RX,我想让它的合成时间可配置,无论是否接收到奇偶校验位:

module uart_rx # (
    parameter EXPECT_PARITY_BIT = 0,
    parameter CLK_PER_BAUD = 434,
    parameter CLK_PER_BAUD_WIDTH = 9
) (
    input clk,
    input rst,
    input uart_rx,
    output reg data_ready,
    output reg parity_bit = 1'H0,
    output [7:0] data
);
如果EXPECT_奇偶校验位为零,则FSM中会发生以下情况:

receiveData:
    if (current_rx_bit == 8) begin
        if (EXPECT_PARITY_BIT == 1)
            nextState = receiveParity;
        else
            nextState = receiveStop;
    end
变量奇偶校验位设置如下:

always @(posedge clk) begin
    if (rst == 1)
        parity_bit <= 1'H0;
    else if (receive_parity == 1 && mtimer_done == 1)
        parity_bit <= uart_rx;
end
始终@(posedge clk)开始
如果(rst==1)

奇偶校验位因为它是一个非运行时评估,所以您可以使用生成块(假设您的工具集是Verilog-2001恭维)

示例(未测试):

生成
如果(期望奇偶校验位==1)开始:g\U奇偶校验
始终@(posedge clk)开始
如果(rst==1)

我很久以前就放弃了抑制警告。在我的C或C++代码中,我仍然这样做,在HDL中,我发现它是不可能的。当然是Xilinx工具。
Xst:1293 - FF/Latch <parity_bit> has a constant value of 0 in block <uart_rx>. This FF/Latch will be trimmed during the optimization process.
generate
  if (EXPECT_PARITY_BIT == 1) begin : g_parity
    always @(posedge clk) begin
      if (rst == 1)
        parity_bit <= 1'H0;
      else if (receive_parity == 1 && mtimer_done == 1)
        parity_bit <= uart_rx;
    end
  end
  else begin : g_no_parity
    initial parity_bit = 1'b0;
  end
endgenerate