Verilog如何使用子模块内部的输入和输出始终阻塞

时间:2013-05-30 19:08:21

标签: verilog

我有一个问题(由于缺乏理解),我在另一个文件中构建了一个模块,并希望让我的更高级别(不一定是顶层)模块通过提供输入来使用它,并获得输出模块。下面是简化形式的代码片段,用于说明我的问题。

module translate_packet_data(rx_packet, packet_size, do_analysis, output_ascii);

reg [7:0] gps_utc_hour;
reg [7:0] gps_utc_min;
reg [7:0] gps_utc_sec;
reg [31:0] gps_utc_milli;

wire [3:0] utc_hour_hundreds_w,utc_hour_tens_w,utc_hour_ones_w;
reg [3:0] utc_hour_hundreds,utc_hour_tens,utc_hour_ones;


binary8_to_BCD utc_hour_BCD(
    .binary(gps_utc_hour), 
    .Hundreds(utc_hour_hundreds_w), 
    .Tens(utc_hour_tens_w),
    .Ones(utc_hour_ones_w)
);

always @ (posedge do_analysis) begin
 //Do all my logic stuff
    gps_utc_hour = rx_packet[pointer-:8];
 //more logic stuff, but thats besides the point

 //Here is where illegal stuff happen that I don't know how to get around, even though it is synthesizable, the simulation reveals it is wrong
    utc_hour_tens = utc_hour_tens_w;
    utc_hour_tens = utc_hour_tens + 48;
    reg_output_ascii = {reg_output_ascii, utc_hour_tens};

end

正如您可以从我的代码片段中看到的那样,utc_hour_tens_w尚未解决,我将从模拟中获得XXXX。所以我的问题是如果我想维护这个模块中的所有翻译逻辑,我该如何解决这个问题呢? (是的,我知道提供的代码不起作用,它是问题相关部分的粗略复制/粘贴工作,完整代码有大约600行,你们都不想看到)

目标主要是获取数据包,提取有意义的部分,将其转换为BCD,然后将其转换为ASCII并将其存储到输出到计算机的输出寄存器中。

2 个答案:

答案 0 :(得分:2)

我认为您的敏感度列表是错误的。

always @ (posedge do_analysis) begin
 //Do all my logic stuff
    gps_utc_hour = rx_packet[pointer-:8];
 //more logic stuff, but thats besides the point

 //Here is where illegal stuff happen that I don't know how to get around, even though it is synthesizable, the simulation reveals it is wrong
    utc_hour_tens = utc_hour_tens_w;
    utc_hour_tens = utc_hour_tens + 48;
    reg_output_ascii = {reg_output_ascii, utc_hour_tens};

end

如果这只是一个组合块(不是时钟序列逻辑),那么你应该只使用推断的灵敏度列表always @*。这将确保utc_hour_tens_w包含在灵敏度中,并且您的输出将在utc_hour_tens_w完成后立即更新。

如果你试图阻止输出在do_analysis为低时改变,那么在块内部做一个if条件,不要试图通过弄乱灵敏度列表来控制组合逻辑。

答案 1 :(得分:0)

问题在于您尝试在单个顺序块中分配两次寄存器,第二次使用从自身派生的数据。您可以尝试使用utc_hour_tens = ...

替换这对utc_hour_tens <= utc_hour_tens+48作业