Verilog错误处理“始终”块中的两个posedge信号

Verilog错误处理“始终”块中的两个posedge信号,verilog,fpga,iverilog,Verilog,Fpga,Iverilog,我对Verilog中的always块有问题。首先让我介绍一下代码: module syncRX(clk, signal, detect, output clk_1khz); input clk, signal; output reg [7:0] detect = 0; //wire clk_1khz; freq_div div(.clk(clk), .clk_1khz(clk_1khz)); always @(posedge signal, p

我对Verilog中的always块有问题。首先让我介绍一下代码:

module syncRX(clk, signal, detect, output clk_1khz);
    input clk, signal;
    output reg [7:0] detect = 0;

    //wire clk_1khz;
    freq_div div(.clk(clk), .clk_1khz(clk_1khz));
    
    always @(posedge signal, posedge clk_1khz)
     begin
        detect <= detect + 1;
     end

endmodule // top

module freq_div(input clk, output reg clk_1khz);
    reg [12:0] count = 0;
    always @(posedge clk)
     begin
        if(count == 6000)
            begin
                clk_1khz <= ~clk_1khz;
                count <= 0;
            end
        else
            count <= count + 1;
     end
    
endmodule
因为如果始终在posedge信号处更改,则始终在posedge信号处的posedge时钟频率为1khz

也会以同样的方式失败:

always @(posedge signal)
     begin
        detect <= detect + 1;
     end
    
    always @(posedge clk_1khz)
     begin
        detect <= detect + 1;
     end

当注释测线检测时,错误消失。我想您可以对每个clk_1khz和信号使用单独的计数器。然后再加上:

always @(posedge signal)
     begin
        detect_sig <= detect_sig + 1;
     end
    
always @(posedge clk_1khz)
     begin
        detect_clk <= detect_clk + 1;
     end

assign detect = detect_sig + detect_clk;
不过,@posedge信号对我来说很奇怪。在这里,除了时钟,你什么都不能用。所以,检查你的算法

而且,您还应该在合成之前模拟和验证您的模型


因为您在另一个问题中提出了这个问题,所以您的第二个变体(具有2个不同的always块)也不可合成。它导致检测信号由多个ALYST块驱动,并在合成中造成多个驱动条件。在模拟中,它将导致不确定的结果。合成应该中断。检查消息。

您试图创建无法合成的东西:一个具有两个时钟的触发器。您需要围绕检测信号解释您的算法。你用信号作为时钟的事实看起来很可疑。它的性质是什么?它与clk有什么关系?感谢answer Toolic,这是一个算法的早期阶段,其想法是在两种情况下增加一个计数器,或信号或clk_1khz,尚未实现,但目标是:假设信号中连续出现三个1,波特率为1khz,您可以使用clk_1khz计算有多少个1,但是我没有到达那里,我只是在堆栈中进行编译。嗨,Serge,谢谢你的回答,好吧,我尝试了你的解决方案,但仍然在不断改进,seams-assign-detect=detect\u-sig+detect\u-clk;警告:设计中未发现时钟,FPGA不响应。。。应该是不同的解决方案。这是一个不同于你以前的信息。我把我的问题贴错了地方…@CarlosJ。这是一个很好的答案。似乎您应该查看如何为您的环境声明时钟。@Moberg,您是对的,detect被声明为寄存器,这就是我发出警告的原因!
always @(posedge signal)
     begin
        detect_sig <= detect_sig + 1;
     end
    
always @(posedge clk_1khz)
     begin
        detect_clk <= detect_clk + 1;
     end

assign detect = detect_sig + detect_clk;