Vhdl 警告";“无负载”;,但我可以';我不明白为什么

Vhdl 警告";“无负载”;,但我可以';我不明白为什么,vhdl,fpga,lattice-diamond,Vhdl,Fpga,Lattice Diamond,对于任何uart的每个实例,我都从Lattice Diamond获得了这些警告(目前为11) VHDL代码是 entity UART is generic ( dividerCounterBits: integer := 16 ); port ( Clk : in std_logic; -- Clock signal Reset : in std

对于任何uart的每个实例,我都从Lattice Diamond获得了这些警告(目前为11)

VHDL代码是

entity UART is 
    generic (
        dividerCounterBits: integer := 16
    );
    port (
        Clk         : in  std_logic;                        -- Clock signal
        Reset       : in  std_logic;                        -- Reset input
        ClockDivider: in  std_logic_vector(15 downto 0);

        ParityMode  : in std_logic_vector(1 downto 0);      -- b00=No, b01=Even, b10=Odd, b11=UserBit
    [...]


architecture Behaviour of UART is
    constant oversampleExponent : integer := 4;

    subtype TxCounterType is integer range 0 to (2**(dividerCounterBits+oversampleExponent))-1;
    subtype RxCounterType is integer range 0 to (2**dividerCounterBits)-1;
    signal rxCounter: RxCounterType;
    signal txCounter: TxCounterType;
    signal rxClockEn: std_logic; -- clock enable signal for receiver
    signal txClockEn: std_logic; -- clock enable signal for transmitter
begin
    rxClockdivider:process (Clk, Reset)
    begin
        if Reset='1' then
        rxCounter <= 0;
        rxClockEn <= '0';
    elsif Rising_Edge(Clk) then
        -- RX counter (oversampled)
        if rxCounter = 0 then
            rxClockEn <= '1';
            rxCounter <= to_integer(unsigned(ClockDivider));
        else
            rxClockEn <= '0';
            rxCounter <= rxCounter - 1;
        end if;
    end if;
    end process;

    txClockDivider: process (Clk, Reset)
    [...]

    rx: entity work.RxUnit
    generic map (oversampleFactor=>2**oversampleExponent)
    port map (Clk=>Clk, Reset=>Reset, ClockEnable=>rxClockEn, ParityMode=>ParityMode,
            ReadA=>ReadA, DataO=>DataO, RxD=>RxD, RxAv=>RxAv, ParityBit=>ParityBit,
            debugout=>debugout
             );

end Behaviour;
实体UART是
一般的(
除法计数器位:整数:=16
);
港口(
时钟:在标准逻辑中;--时钟信号
复位:在标准_逻辑中;--复位输入
时钟分频器:标准逻辑向量(15到0);
ParityMode:在标准逻辑向量(1到0)中--b00=No,b01=偶数,b10=奇数,b11=UserBit
[...]
UART的体系结构行为是
常数过采样指数:整数:=4;
子类型TxCounterType是范围为0到(2**(dividerCounterBits+过采样指数))的整数-1;
子类型RxCounterType是范围为0到(2**dividerCounterBits)-1的整数;
信号rxCounter:RxCounterType;
信号txCounter:TxCounterType;
信号RxCloken:std_逻辑——接收器的时钟启用信号
信号txClockEn:std_逻辑——变送器的时钟启用信号
开始
rxClockdivider:进程(时钟、复位)
开始
如果Reset='1',则
rxCounter ReadA,DataO=>DataO,RxD=>RxD,RxAv=>RxAv,ParityBit=>ParityBit,
debugout=>debugout
);
终端行为;
这是一个Uart,为了创建所有Uart(目前为11个Uart),我使用这个

-- UARTs

    UartGenerator: For i IN 0 to uarts-1 generate
    begin
        Uart_i : entity work.UartBusInterface 
            port map (Clk=>r_qclk, Reset=>r_reset, 
                cs=>uartChipSelect(i), nWriteStrobe=>wr_strobe, nReadStrobe=>rd_strobe,
                address=>AdrBus(1 downto 0), Databus=>DataBus,
                TxD=>TxD_PAD_O(i), RxD=>RxD_PAD_I(i),
                txInterrupt=>TxIRQ(i), rxInterrupt=>RxIRQ(i), debugout=>rxdebug(i));

        uartChipSelect(i) <= '1' when to_integer(unsigned(adrbus(5 downto 2)))=i+4 and r_cs0='0' else '0';
    end generate;
——UART
UartGenerator:对于0中的i,生成uarts-1
开始
Uart_i:entity work.UartBusInterface
端口映射(Clk=>r\U qclk,Reset=>r\U Reset,
cs=>uartChipSelect(i),nWriteStrobe=>wr_strobe,nReadStrobe=>rd_strobe,
地址=>AdrBus(1到0),数据总线=>Databus,
TxD=>TxD_PAD_O(i),RxD=>RxD_PAD_i(i),
txInterrupt=>TxIRQ(i),rxInterrupt=>RxIRQ(i),debugout=>rxdebug(i));

uartChipSelect(i)此警告表示没有人在“监听”这些网络

可以在合成中删除信号。警告不是错误!你只需要注意它们

我们无法从您的部分代码中评估发生了什么

  • 是否有名为
rxCounter\u cry的信号
  • 时钟分配器的数据类型是什么
    
  • dividerCounterBits
    的值是多少
  • 在另一个过程中会发生什么?如果不相关,请尝试在没有该过程的情况下运行合成。如果它是相关的,我们需要看到它

    • 这个警告意味着没有人在“听”那些网络

      可以在合成中删除信号。警告不是错误!你只需要注意它们

      我们无法从您的部分代码中评估发生了什么

      • 是否有名为
    rxCounter\u cry的信号
  • 时钟分配器的数据类型是什么
    
  • dividerCounterBits
    的值是多少
  • 在另一个过程中会发生什么?如果不相关,请尝试在没有该过程的情况下运行合成。如果它是相关的,我们需要看到它

  • Lattice
    ngdbuild
    对于它所做的工作来说特别垃圾,我通过makefile中的grep来传递ngdbuild输出,以完全删除这些消息:

    ngdbuild ... | grep -v "ngdbuild: logical net '.*' has no load"
    
    除此之外,还有2500多个这样的问题,消除它们有助于集中精力解决实际问题

    第二个最糟糕的工具链垃圾邮件发送者是
    edif2ngd
    ,他们抱怨Verilog参数没有明确的处理方法。这是一条两行消息(超过300条),因此我使用以下方法删除它:

    edif2ngd ... | sed '/Unsupported property/{N;d;}'
    

    Lattice
    ngdbuild
    对于它所做的工作来说特别垃圾,我通过我的makefile中的grep管道ngdbuild输出,以完全删除以下消息:

    ngdbuild ... | grep -v "ngdbuild: logical net '.*' has no load"
    
    除此之外,还有2500多个这样的问题,消除它们有助于集中精力解决实际问题

    第二个最糟糕的工具链垃圾邮件发送者是
    edif2ngd
    ,他们抱怨Verilog参数没有明确的处理方法。这是一条两行消息(超过300条),因此我使用以下方法删除它:

    edif2ngd ... | sed '/Unsupported property/{N;d;}'
    

    请注意,有时它使用加法器来实现一些事情。最高阶位不使用该加法器的进位输出,最低阶位不使用符号输入。所以你会得到这样的警告:

    警告-合成:逻辑网络“时钟链/dcmachine/count\u 171\u add\u 4\u 1/S0”没有负载 警告-合成:逻辑网络“时钟链/dcmachine/count\u 171\u add\u 4\u 19/CO”没有负载


    没问题,位19是最高的,所以它不会携带任何信息,位1是最低的,所以它不会从任何地方获得符号位。但是,如果您在最高和最低之间的任何位上收到此警告,则通常意味着有问题,但不是错误,因此它将在您测试时生成“有效”的内容,但不是在错误情况下。如果你用错误案例来模拟它,它通常会显示不理想的结果。

    请注意,有时它会用加法器来实现。最高阶位不使用该加法器的进位输出,最低阶位不使用符号输入。所以你会得到这样的警告:

    警告-合成:逻辑网络“时钟链/dcmachine/count\u 171\u add\u 4\u 1/S0”没有负载 警告-合成:逻辑网络“时钟链/dcmachine/count\u 171\u add\u 4\u 19/CO”没有负载


    没问题,位19是最高的,所以它不会携带任何信息,位1是最低的,所以它不会从任何地方获得符号位。但是,如果您在最高和最低之间的任何位上收到此警告,则通常意味着有问题,但不是错误,因此它将在您测试时生成“有效”的内容,但不是在错误情况下。如果你用错误案例模拟它,通常会显示不理想的结果。

    你试过模拟你的代码吗?@sonicwave-否,但我可以对它进行语法分析,它可以按预期工作。你试过模拟你的代码吗?@sonicwave-否,但我可以对它进行语法分析,它可以按预期工作。谢谢,我添加了一些代码片段。