首页 文章

Value 未及时分配

提问于
浏览
1

我做了非常简单的模块,我在时钟的posedge上分配了新的值:

module block_entry(
    input logic clk, 
    input entry entry_write,
    output entry entry_this
);
always_ff @(posedge clk)
begin
    entry_this <= entry_write;
    display("value of entry_write.add = %b", entry_write.address);
    display("value of entry_write.value = %b", entry_write.value);
end
endmodule

当我测试这个模块时,它运行正常,分配了新值,但在更高级的架构中,新值没有及时设置以在posedge上写入,即使modelsim显示它已设置

这是我的测试模块:

module entry_tst ();
    logic clk;
    entry entry_write, entry_this;
    block_entry entry (.*);

initial begin
    #10 clk = 1; entry_write = '0; 
end
endmodule

这是结果 - > wavedataflow

在测试块时,结果是:

entry_write.add = 0000000000000000的值

entry_write.value = 0000000000000000的值

如您所见,clk在输入值更改的同时从x转换为1 - 结果,输出值被覆盖

但问题是当我在我的架构中使用这个模块时,它表现不一样 - 输入是相同的,但是值没有被覆盖,好像没有触发posedge,但实际上看起来没有及时设置值posedge . 我的架构包括:

  • 条目块

  • 控制块(我的架构的'大脑',选择应该将哪个值写入入口块,生成信号'cont'到多路复用器,还为入口块生成信号'clk'何时从多路复用器分配值,'clk'是逻辑,所以默认值是x开头)

  • mux(多路复用器根据来自控制块的信号选择将什么值写入入口块)

最初我想将条目值设置为0,所以我有一个'init'信号,当init等于1时,控制器相应地设置'cont'信号,因此mux选择设置为0的流并设置'clk'这样的条目block会将旧值重写为new(0)

always_ff @(posedge init) 
    if (init)
    begin   
    cont <= 2'b00;
    clk <= 1;
end

一切正常 - 输入块到达新值并设置'clk'信号,但忽略新值这描述了作为体系结构一部分的输入块的波行为:wavedataflow

在测试整个架构时,结果是:

entry_write.add = xxxxxxxxxxxxxxxx的值

entry_write.value = xxxxxxxxxxxxxxxx的值

怎么了?我真的很绝望,我是一个systemverilog新手 .

Can timescale change something (it is set to default 1ns/1ns)? Also sometimes when i observe the dataflow, in the moment of change, clk is set to 1 but the value to be written is not set to 0 - can this be the problem? that the change of clk and value is not in fact happening in the same time, and when posedge is triggered value is still old?

How come the value is not distributed in time and how can I fix it? 另外,为什么wave和dataflow看起来还好?

EDIT:

我认为问题是赛车条件,基本上, Value 不及时写入:
problem

我创建了一个显示我的实现的图表,我怎样才能实现entry_write在clk之前的时间?
diagram

1 回答

  • 0

    代码中的以下表达式创建竞争条件:

    always_ff @(posedge init) 
        if (init)
            clk <= 1;
    

    如果加上

    always_ff @(posedge clk)
        entry_this <= entry_write;
    

    它导致了NBA区域的比赛,这里的任务结果是不可预测的 .

    经验法则是永远不要在时钟中使用非阻塞分配 .

相关问题