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

时间:2016-03-27 22:06:14

标签: verilog fsm synthesis vivado

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

[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]

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

var modelA = Backbone.Model.extend({
    defaults: {
        collection: null
    }
});

var modelB = Backbone.Model.extend({});

var CollectionA = Backbone.Collection.extend({
    model: modelA
});

var CollectionB = Backbone.Collection.extend({
    model: modelB
});

var myCollection = new CollectionA();

myCollection.create({
    collection: new CollectionB()
});

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

1 个答案:

答案 0 :(得分:4)

参考警告。您已在程序块中使用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 @(*)
    begin
            case (y)
                S_00: if (SW1)      Y = S_01; // blocking assignment
                      else          Y = S_00; // blocking assignment
//...

有关详细信息,请参阅Procedural continuous assignment问题。此外,Verilog always blockBlocking vs Non-Blocking statments usage question链接可能很有用。