Verilog 代码将模拟但不会综合。

Verilog code will simulate but won't synthesize.

这是我的有限状态机的代码

//
`timescale 1ns / 1ps
//Moore Finite State Machine Lab 3
// 
// WORKING, needs Screen output

module moore(
    input BTNC,    //manual clk
    input SW0,     //clr
    input SW1,    
    input SW2,     
    input SW3,    
    input SW4,
    output reg [3:0] LED,    //z
    reg [2:0] y,Y
    );
    localparam S_00=3'b000, S_01=3'b001, S_02=3'b010,
               S_03=3'b011, S_04=3'b100;

//Define next state
    always @(y,SW0,SW1,SW2,SW3,SW4)
    begin
            case (y)
                S_00: if (SW1)      Y <= S_01;
                      else          Y <= S_00;
                S_01: if (SW1)      Y <= S_02;
                      else if (SW3) Y <= S_03;
                      else          Y <= S_01;
                S_02: if (SW1)      Y <= S_04;
                      else          Y <= S_02;
                S_03: if (SW2)      Y <= S_04;
                      else if (SW3) Y <= S_02;
                      else          Y <= S_03;
                S_04: if (SW2)      Y <= S_02;
                      else if (SW4) Y <= S_00;
                      else          Y <= S_04;
                      default:      Y <= 3'bxxx;
            endcase
        end 

    //Define state update
    always @(SW0, BTNC)
       begin
        if (!SW0) y <= S_00;
        else y <= Y;
       end  

    //Define output
    always @(y)
        if (y==S_00)
            begin 
            assign LED = 3'b000;
            end
        else if (y==S_01)
            begin
            assign LED = 3'b001;
            end
        else if (y==S_02) 
            begin
            assign LED = 3'b010;
            end
        else if (y==S_03)
            begin 
            assign LED = 3'b011;
            end
        else if (y==S_04)
            begin 
            assign LED = 3'b100;
            end
        else
            begin 
            assign LED = 3'b000;  //not used
            end
endmodule // lab3ht codename moore

当尝试在 vivado 2015.3 中进行综合时,这就是它告诉我的内容

[Common 17-69] Command failed: Vivado Synthesis failed
[Synth 8-285] failed synthesizing module 'moore' ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":6]
[Synth 8-27] procedural assign not supported ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":51]
[Synth 8-567] referenced signal 'Y' should be on the sensitivity list ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":41]

我知道无法合成延迟,我尝试通过摆脱来解决这个问题 总是@(negedge BTNC) 并仅使用按钮按下,但就我对 verilog 的了解而言,这就是这些。我不知道为什么这不能被合成,所以我可以稍后生成一个比特流并将它上传到 basys3 板并在那里使用它 非常感谢任何见解,代码在模拟过程中运行得很漂亮

参考警告。您在程序块中使用了 assign 语句,使其成为 程序连续赋值

[Synth 8-27] procedural assign not supported

大多数工具都可以综合这些类型的赋值,但它们很容易被误用,因此尽量避免。您的工具似乎不支持此类语句。因此,删除 assign语句并在每个if..else if..else条件下使用简单的阻塞语句

// Remove assign
else if (y==S_04)
assign LED = 3'b100;
//...
// use simple blocking statements
else if (y==S_04)
LED = 3'b100;

Y 相关的另一个警告是由于 always @(SW0, BTNC) 块的 不完整敏感列表 。您在此块中使用 else y=Y;。今后Y必须出现在敏感列表中。

[Synth 8-567] referenced signal 'Y' should be on the sensitivity list

对于任何组合 always块,always@(*)always_comb的使用是推荐.这将消除 提供手动灵敏度 时的任何错误。您可以在此处将所有 always 块(时钟 always 块除外)的灵敏度转换为 always@(*).

此外,您的下一状态逻辑 always 块是一个组合块。您必须在该块中使用 blocking(=) 赋值。

always @(*)
    begin
            case (y)
                S_00: if (SW1)      Y = S_01; // blocking assignment
                      else          Y = S_00; // blocking assignment
//...

参考 Procedural continuous assignment question for more information. Also, Verilog always block and Blocking vs Non-Blocking statments usage question 链接可能会有用。