Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog获取';x';作为输出而不是';0';和';1';_Verilog - Fatal编程技术网

Verilog获取';x';作为输出而不是';0';和';1';

Verilog获取';x';作为输出而不是';0';和';1';,verilog,Verilog,我正在尝试创建一个具有四位内存地址的四元素直接映射缓存。程序运行完全正常,没有编译错误,但突然在输出中,我只得到第一条语句的“x”。从那以后,我再也看不到它了。任何帮助都将不胜感激。这是密码 module cache_memory_direct_mapped(input clk, input reset, input [3:0]read_addr, ou

我正在尝试创建一个具有四位内存地址的四元素直接映射缓存。程序运行完全正常,没有编译错误,但突然在输出中,我只得到第一条语句的“x”。从那以后,我再也看不到它了。任何帮助都将不胜感激。这是密码

module cache_memory_direct_mapped(input clk,
                        input reset,
                        input [3:0]read_addr,
                        output reg hit,
                        output reg miss,
                        output reg [7:0]hit_count,
                        output reg [7:0]miss_count);
reg [1:0]c1[3:0];
initial 
begin
 hit_count =8'h00; 
 miss_count = 8'h00;
end 
            

always @(posedge clk, posedge reset)                        
 begin
   if(reset)
      begin
       c1[0] <= 2'hx;
       c1[1] <= 2'hx;
       c1[2] <= 2'hx;
       c1[3] <= 2'hx;
      end   
    else  
begin
  if(read_addr[3:2] == c1[0] || read_addr[3:2] == c1[1] || read_addr[3:2] == c1[2] || read_addr[3:2] ==     c1[3])
   begin
   hit <= 1;
   hit_count <= hit_count + 1;
   miss <= 0;
   end
 else
  begin
  hit <= 0;
  miss <= 1;
   miss_count <= miss_count + 1;
    if(read_addr[1:0] == 2'b0 )
        c1[0] <= read_addr[3:2];
    else if(read_addr[1:0] == 2'b1 )
      c1[1] <= read_addr[3:2];  
    else if(read_addr[1:0] == 2'b10 )
      c1[2] <= read_addr[3:2];        
    else if(read_addr[1:0] == 2'b11 )
      c1[3] <= read_addr[3:2];  
 end
 end
 end
endmodule

module Tb_direct_mapped;

// Inputs
reg clk;
reg reset;
reg [3:0] read_addr;

// Outputs
wire hit;
wire miss;
wire [7:0]hit_count;
wire [7:0]miss_count;

integer data_file ; // file handler
integer scan_file ; // file handler
reg [4:0]captured_data;

// Instantiate the Unit Under Test (UUT)
cache_memory_direct_mapped uut (
    .clk(clk), 
    .reset(reset), 
    .read_addr(read_addr), 
    .hit(hit), 
    .miss(miss),
    .hit_count(hit_count),
    .miss_count(miss_count)
);

initial begin
    // Initialize Inputs
    clk = 0;
    reset = 0;
    data_file = $fopen("data_file.txt", "r");
end

always
#10 clk= ~clk;


always @(posedge clk) begin
scan_file = $fscanf(data_file, "%h\n", captured_data);
if (!$feof(data_file)) begin
read_addr <= captured_data;
$display(hit);
//$display(hit_count);
end
else
$finish; 
end

  
endmodule
模块缓存\内存\直接\映射(输入时钟,
输入复位,
输入[3:0]读地址,
输出寄存器命中,
输出注册未命中,
输出寄存器[7:0]命中计数,
输出寄存器[7:0]未命中计数);
reg[1:0]c1[3:0];
首字母
开始
命中次数=8'h00;
未命中计数=8'h00;
结束
始终@(posedge时钟、posedge重置)
开始
如果(重置)
开始

c1[0]我可以看到“缓存\内存\直接\映射”中存在问题。 在else inside always下(复制并粘贴在下面)

if(读地址[1:0]==2'b0)
c1[0]变化:

    $display(hit);
致:

这将产生:

0
0
1
1
0
1
根据IEEE标准1800-2017第21.2.2节选通监测:

系统任务$strobe提供显示模拟的能力 选定时间的数据。那是电流的结束 模拟时间,当该事件的所有模拟事件都已发生时 模拟时间,就在模拟时间提前之前

问题在于,在posedge clk调用
$display
时,信号值正在更改


以下是一些其他调试提示:

  • 使用波形调试器
  • 显示模拟时间以及值:
    $strobe($time,”,hit)

  • 在重置完成之前,通常可以使用“x”。除非重置被中断,因为您将其初始化为
    x
    c1[0]
    
        $strobe(hit);
    
    0
    0
    1
    1
    0
    1