我如何正确使用`always`块?

时间:2016-07-04 08:58:18

标签: verilog fpga xilinx

以下是我在用于XST的verilog中编写的代码的片段。日志中充满了错误。我该如何更正代码?我如何以及在何处使用always@()@()块?我在哪里使用阻止和非阻塞分配?

input wire CLOCK;
input wire [31:0] OUT_SQRT;
output wire [31:0] IN_SQRT;
input wire [31:0] RANDP;

integer randp;
integer flagp;
integer sqrootp;
integer check_primep;

always @(posedge CLOCK and flagp != 0)
begin
    #10
    @(posedge and flagp != 0 )
    begin
        flagp = sqrootp%check_primep;

        if(flagp != 0 and check_primep < sqrootp)
        begin
            check_primep = check_primep + 1;
        end

        @(posedge and flagp == 0)
        begin
            flagp = 1;
            check_primep = 2;
            randp = RANDP;
            #5
            IN_SQRT = randp;
            #10
            sqrootp = OUT_SQRT;
        end
end

2 个答案:

答案 0 :(得分:0)

使用以下隐含的触发器:

always @(posedge clk) begin
  flip_flop_q <= flip_flop_d;
end

使某些事情同步(在时钟上采样)启用:

always @(posedge clk) begin
  if (flagp != 0) begin
    flip_flop_q <= flip_flop_d;
  end
end

使用以下隐含组合逻辑:

always @* begin
  comb_logic = a + b;
end

以下内容(延迟)无法合成:

#10
@(posedge and flagp != 0 ) // no always just a delay waiting for criteria

通常在测试工具中用于等待重置等信号被释放。

initial begin
  @(posedge reset_n);
  @(posedge clk);
  @(posedge clk);
  //begin test procedure
end

如果你需要在可合成的verilog中等待信号,你需要建立一个FSM(有限状态机)来对你的逻辑进行排序。

答案 1 :(得分:0)

你在一篇文章中提出了许多问题。

也许最适合你的是完成关于Verilog的教程。

http://vol.verilog.com/

有一个免费的

的Mac