Verilog 显示中的不必要空格
我试图以小数为单位显示32位值,除了我的%b和以前的字符之间的奇怪数量不必要的空间外,这还不错. 例如: 如果我有一个32位的Reg A,小数为33,我将使用类似的东西 initial begin $display("a=%d;", a); end CMD中的输出看起来与此相似: a = ___________________ 33; 该行仅表示%b和上一个char之间的长空白空间. 有人可以向我解释为什么会发生这种情况吗?我怎么能摆脱它们? 解决方案 在 ieee std 1800-2012 (( 21.2.1.3)您可以找到以下信息: 显示十进制值时,领先的零会被抑制并由空间取代.在其他辐射中,始终显示领先的零. 这就是为什么您在33之前获得了这么多空间的原因.最简单的实现您想要的方法是: $display("a=%0d;", a); 通过在%字符和d之间添加0(指示radix的字母)被覆盖了显示数据的自动尺寸.结果将以最小
24 2024-04-23
编程技术问答社区
verilog 什么时候使用当前时隙的值,什么时候使用上一时隙的值?
这是一个简短的示例代码,它使我感到困惑.在Verilog过程中使用当前或以前的仿真时间段时使用值的规则是什么? module test(); reg clk, rst, r1, r2, r3; initial begin clk = 0; rst = 0; r1 = 0; r2 = 0; r3 = 0; @(posedge clk) rst = 1; end // initial always #5 begin : clkgen clk = ~clk; end /** TESTS **/ // PREVIOUS always @(posedge clk) begin : proc_non_block r1 = rst; end // CURREN
16 2024-04-22
编程技术问答社区
Vivado 模拟错误: 达到迭代限制 10000
当我试图在Vivado运行模拟时,我得到了: 错误:达到迭代限制10000.可能的零延迟 振荡检测到模拟时间无法前进的地方.请 检查您的源代码.请注意,迭代限制可以更改 使用开关-maxdeltaid.时间:10 NS迭代:10000 我在我的模块中没有任何初始语句. 有人可以指出问题可能在哪里? `timescale 1ns / 1ps module mulp( input clk, input rst, input start, input [4:0] mplier, // -13 input [4:0] mplcant, // -9 output reg done, output [9:0] product ); parameter N = 6; parameter Idle = 2'b00; parameter Load = 2'b01; parameter Oper = 2'b10; parameter Finish = 2'b11; reg d
30 2024-04-22
编程技术问答社区
模拟输出全为零
我的设计块和测试台编译的代码;但是,当我模拟时,我没有得到正确的输出.谁能告诉我我在代码中出错的地方? 这是测试台的代码: module testbench; reg [511:0]FROM_LS; reg CLK; reg [63:0]TO_IF_ID; initial begin CLK= 0; TO_IF_ID[63:0]=63'b0; FROM_LS[511:480]= 32'b00011_00000_00100_01100_11100_10111_01; FROM_LS[479:448]=32'b00_11000_00100_01111_11111_00011_10000; end always begin #10 CLK= ~ CLK; //FROM_LS[511:448]= ~ FROM_LS[511:448]; $display("FROM_LS= %b", FROM_LS); $display("TO_IF_ID=
20 2024-04-22
编程技术问答社区
为什么 HDL 仿真(源代码)可以访问模拟器的 API?
这是一个受此问题和答案对启发的问题: call questa sim命令来自systemverilog测试台 问题询问Verilog代码如何控制执行模拟器(QuestAsim).我也看到了VHDL的类似问题和方法. 所以我的问题是: 为什么模拟(从)具有模拟器(主)的力量? 什么是典型用例? 进一步阅读: 解决方案 为什么?谁能回答"为什么"?好吧,也许是导致创建此类行为的产品工程师或Mentor的开发人员可以回答这种情况.但是缺少这一点,我们只能猜测.这就是我在这里做的. 我可以想到一些可能的用例,但是它们并不是无法以其他方式完成的事情.例如,一个人可以具有一个通用的"测试台控制器",具体取决于通用/参数可以调用某些模拟器行为. (编辑:重新阅读了您的链接之一后,我看到这是确切的用例.) 例如,说我有此"通用"测试台代码为: module testbench; parameter LOG_SIGNALS = 1'b0; initi
18 2024-04-22
编程技术问答社区
如何自动缩放 $display 列宽?
免责声明:我回答了自己的问题,这是显然鼓励了.我注意到一个工作代码的同事,使模拟日志文件难以阅读.我搜索了该网站的解决方案,但没有发现. 我想在固定宽度表中的列中$display字符串. 但是,我不知道我的字符串的最大列宽度是多少 提前. 假设我有一系列SystemVerilog字符串(names). 当我$display它们时,我猜列(10)的宽度, 但是我的猜测太小了: module tb; string names [5]; initial begin names = '{ "ALU" , "COMPARATOR_3" , "MEMORY" , "FLOP" , "ram_macro_with_a_long_name" }; // Display all elements of the array
22 2024-04-22
编程技术问答社区
如何通过ncverilog编译器使用verilog PLI与c通信
我想与Verilog通信C.我发现Verilog PLI可以解决我的问题.我阅读了这个网站以学习 C代码:Hello.c #include void hello(){ printf("HELLO"); } 制作库: gcc hello.c -fPIC -shared -o hello.so Verilog代码:test.v module test(); initial begin $hello; #10 $finish; end endmodule verilog命令: ncverilog test.v +access+r -v hello.so 解决方案 vpi (PLI 2.0) hello_vpi.c: #include #include void hello(){ printf("HELLO"); } void re
18 2024-04-10
编程技术问答社区
我们可以在C语言或SystemVerilog的ifdef MACROS中使用条件吗?
我想要这样的东西 `ifdef N_O > N_I `define GREATER 1 `else `define LESSER 1 `endif ,但不能做.有任何解决方案或阅读吗? 我努力做到这一点,但无法做到. 解决方案 Verilog不提供这样的设施.文本宏只有一个动作:检查它们的存在.因此有 `ifdef, `ifndef和 `elsif.所有人都只接受单个参数,该参数是文本宏的名称. 在许多情况下,可以使用generate verilog功能来增加这种功能短缺.此功能的使用是优选的,因为Verilog控制语法和声明的范围. 以下是使用生成功能的示例: module mod #(parameter N_0=1, parameter N_1=2)(input logic in1, in2, output logic out); if (N_1 > N_2) begin
12 2024-04-07
编程技术问答社区
对数字进行比较排序,然后得到中位数值
使用位或比较操作员对五个整数进行排序可以通过获得最高的数字,然后获得第二高的数字,然后是第二高,依此类推. 这是我获得最高数字的代码: #include int main() { int a, b, c, d, e; int aa, bb, cc, dd, ee; a = 4; b = 2; c = 5; d = 1; e = 3; aa = (a > b) ? ((a > c) ? ((a > d) ? ((a > e) ? a : e) : ((d > e) ? d : e)) : ((c > d) ? ((c > e) ? c : e) : ((d > e) ? d : e))) : ((b > c) ? ((b > d) ? ((b > e) ? b : e) : ((d > e) ? d : e)) :
12 2024-04-07
编程技术问答社区
从Chisel代码生成Verilog代码的最简单方法
从现有凿子代码中生成Verilog 代码的最简单方法是什么? 我是否必须创建自己的构建文件? 例如,来自独立的scala文件(and.scala),如以下一个.. import Chisel._ class AND extends Module { val io = IO(new Bundle { val a = Bool(INPUT) val b = Bool(INPUT) val out = Bool(OUTPUT) }) io.out := io.a & io.b } 我在ubuntu 16.4. 下安装了完整的 Chisel3工具链 解决方案 请参阅此处的答案:有一个简单的示例,说明如何从Chisel3模块生成Verilog? 简而言 scalaVersion := "2.12.13" resolvers ++= Seq( Resolver.sonatypeRepo("snapshots"), R
44 2024-04-05
编程技术问答社区
Verilog ! 和 ~ 之间的区别是什么?
因此,最终使我持续了几天的错误是代码的一部分,应该评估为false评估为true.我的初始代码类似: if(~x && ~y) begin //do stuff end 即.如果x不是一个,而不是一个,那就做一些事情.踏上调试器,我意识到,即使X是1,IF-Statement中的表达仍然导致了真实,并且执行了后续代码. 但是,当我将语句更改为: 时 if(x == 0 && y == 0) begin //do stuff end 也尝试了: if(!x && !y) begin //do stuff end 未评估IF-Stategent中的代码是预期的行为.我知道〜是一个比较否定的!逻辑上的否定,但不应该(〜x && 〜y)和(!x &&!y)评估同一件事吗?恐怕代码库太大了,所以我不能在这里粘贴它,但这是我按照预期进行代码进行工作的唯一更改.谢谢. 回应以下评论之一,我创建了一个测试案例来测试此行为: `timescale 1
28 2024-04-01
编程技术问答社区
自触发的时钟发生器中的Verilog阻塞/非阻塞分配
为什么以下代码没有自触发? module osc1 (clk); output clk; reg clk; initial #10 clk = 0; always @(clk) #10 clk = ~clk; always begin $monitor("%0d clk=%0d\n",$time,clk); #100 $finish; end endmodule 输出: # 0 clk=x # 10 clk=0 # 20 clk=1 使用非阻滞分配时,它正常起作用 即,always @(clk) #10 clk
14 2024-04-01
编程技术问答社区
Verilog封锁作业
我对Verilog有些新.我知道,在时钟过程中,我们应该使用非阻止分配,在非时钟过程中,我们使用阻止分配. 当我阅读别人的代码时,我遇到了此代码. reg iowrb_int,iowrb_met; reg iordb_int,iordb_met; always@(*) begin iowrb_int
12 2024-04-01
编程技术问答社区
|变量在verilog中是什么意思?
我想知道assign hd_trs_detected = |hd_trs_match;在Verilog中的含义.我对|hd_trs_match部分感兴趣.我知道|意味着在|之前没有值的情况下(但不确定)如何解释它.它是一个理解的" 1"或" 0"?如果是" 0",则使用|hd_trs_match与Just hd_trs_match的优势是hd_trs_detected始终是hd_trs_match is> hd_trs_match?还是本身有点明智的操作. 解决方案 |是一个还原操作员.对于多位信号,它会产生一个输出,将操作数应用于向量的每个位. 例如, wire [3:0] in; wire out; assign out = |in; // the same as out = in[3] | in[2] | in[1] | in[0]; 您可以使用&,^等进行同样的操作. 其他解决方案 在此使用中,|是一个还原操作员,而不是位于比特的操作员.还原运算符
36 2024-03-31
编程技术问答社区
Verilog中可合成的算术移位
我最近遇到了在Stackoverflow上这个答案. 使用Verilog,一旦您进行了部分选择,结果就不会签名.在零件上使用$signed系统任务进行选择以使其签名. 是此方法合成的(即系统任务$signed) 如果它不合理,是否有其他方式在a >>2等变量上执行算术转移(当a除以4时,这应该给出商. 解决方案 它肯定是可以合成的.您的特定工具是否支持这是另一个问题. 您也可以在SystemVerilog中使用铸件. res = signed'(registers[0][0]) >>> 2;
12 2024-03-31
编程技术问答社区
算术移位的作用与逻辑移位相同,与有符号变量无关。
我已经声明了一个登记册: logic signed [15:0][2:0][15:0] registers; 当我将2的赞美编号放入数组中并算术上移动数字时,它会逻辑上移动: registers[0][0] = 16'b1000000000000000; registers[0][0] = registers[0][0]>>>2; 显然,如果数字未签名,则系统将逻辑移动而不是算术偏移.但是,正如您可以清楚地看到的那样,"寄存器"肯定是签署的. 有人知道我在这里可能缺少什么吗? 谢谢! 解决方案 使用Verilog,一旦您采取了部分选择,结果为unsigned.在零件上使用$signed系统任务进行选择以使其签名. res = $signed(registers[0][0]) >>> 2;
12 2024-03-31
编程技术问答社区
Verilog 桶形移位器
我想在Verilog中创建一个64位枪管变速杆(目前旋转).我想知道是否有没有写65个零件案例语句的方法?有没有办法编写一些简单的代码,例如: Y = {S[i - 1:0], S[63:i]}; 我在xilinx中尝试了上面的代码,并得到一个错误:我不是常数. 主要问题:有没有大量案件陈述的方法? 解决方案 我已经简化了一些清晰的规则,但这是细节. 在语句中 Y = {S[i - 1:0], S[63:i]}; 您有两个信号的串联,每个信号都有一个恒定的零件选择.恒定零件选择是形式 的 标识符[constant_expression:constant_expression] 但是您的代码使用一个变量来进行第一个表达式.如您所见,不允许这样做,但是您是正确的,因为有多种方法可以避免键入大型案例声明.您可以使用的是索引零件选择.这些是形式 标识符[表达式 +:constant_expression] 标识符[表达式 -
30 2024-03-31
编程技术问答社区
Verilog有符号与无符号样本和第一
假设我有一个寄存器reg [15:0] my_reg,其中包含16位签名样本: 如何将样本从签名转换为未签名? 我读过my_reg是正面还是负面的,并且它在每个时钟周期中都会发生变化=我在每个正时钟边缘都会收到一个新的样本). 最终目标(添加一点上下文)是实现数字FPGA内置自动增益控制(AGC). 编辑:所建议的,我已经在两个不同的帖子中将两个问题分开了.请参阅另一个 在这里 解决方案 在Verilog A中包含二进制数据,签名的无符号只是一个解释问题.位值保持不变,始终使用Two的补充进行减法和加法. 例如,我们可以查看4位值,并查看如何解释数字: Binary Unsigned signed 1000 8 -8 1110 14 -2 1111 15 -1 0001 1 1 0010
12 2024-03-31
编程技术问答社区